Commit 561ad088 by lepdou

add cat restapi transaction & fix email windows outlook bug

parent 66c20025
......@@ -76,6 +76,11 @@ public class PortalSettings {
return activeEnvs;
}
public boolean isEnvActive(Env env) {
Boolean mark = envStatusMark.get(env);
return mark == null ? false : mark;
}
private class HealthCheckTask implements Runnable {
private static final int ENV_DOWN_THRESHOLD = 2;
......
......@@ -85,6 +85,7 @@ public class RetryableRestTemplate {
String uri = uriTemplateHandler.expand(path, uriVariables).getPath();
Transaction ct = Tracer.newTransaction("AdminAPI", uri);
ct.addData("Env", env);
List<ServiceDTO> services = getAdminServices(env, ct);
......@@ -126,6 +127,7 @@ public class RetryableRestTemplate {
String uri = uriTemplateHandler.expand(path, uriVariables).getPath();
Transaction ct = Tracer.newTransaction("AdminAPI", uri);
ct.addData("Env", env);
List<ServiceDTO> services = getAdminServices(env, ct);
......
......@@ -101,6 +101,21 @@ public class PortalConfig extends RefreshableConfig {
/***
* Level: low
**/
public Set<Env> publishTipsSupportedEnvs() {
String[] configurations = getArrayProperty("namespace.publish.tips.supported.envs", null);
Set<Env> result = Sets.newHashSet();
if (configurations == null || configurations.length == 0) {
return result;
}
for (String env : configurations) {
result.add(Env.fromString(env));
}
return result;
}
public String consumerTokenSalt() {
return getValue("consumer.token.salt", "apollo-portal");
}
......@@ -109,12 +124,20 @@ public class PortalConfig extends RefreshableConfig {
return getValue("email.sender");
}
public String publishEmailBodyTemplate() {
return getValue("email.template.release.v2", "");
public String emailTemplateFramework() {
return getValue("email.template.framework", "");
}
public String emailReleaseDiffModuleTemplate() {
return getValue("email.template.release.module.diff", "");
}
public String rollbackEmailBodyTemplate() {
return getValue("email.template.rollback.v2", "");
public String emailRollbackDiffModuleTemplate() {
return getValue("email.template.rollback.module.diff", "");
}
public String emailGrayRulesModuleTemplate() {
return getValue("email.template.release.module.rules", "");
}
/***
......@@ -139,6 +162,10 @@ public class PortalConfig extends RefreshableConfig {
return getIntProperty("ctrip.email.survival.duration", 5);
}
public boolean isSendEmailAsync() {
return getBooleanProperty("email.send.async", true);
}
public String portalServerName() {
return getValue("serverName");
}
......
......@@ -31,36 +31,48 @@ public class GrayPublishEmailBuilder extends ConfigPublishEmailBuilder {
@Override
public String emailContent(Env env, ReleaseHistoryBO releaseHistory) {
String result = renderEmailCommonContent(getReleaseTemplate(), env, releaseHistory);
String result = renderEmailCommonContent(env, releaseHistory);
return renderGrayReleaseRuleContent(result, releaseHistory);
}
private String renderGrayReleaseRuleContent(String template, ReleaseHistoryBO releaseHistory) {
String result = template.replaceAll(EMAIL_CONTENT_RULE_SWITCH, "");
@Override
protected String getTemplateFramework() {
return portalConfig.emailTemplateFramework();
}
@Override
protected String getDiffModuleTemplate() {
return portalConfig.emailReleaseDiffModuleTemplate();
}
private String renderGrayReleaseRuleContent(String bodyTemplate, ReleaseHistoryBO releaseHistory) {
Map<String, Object> context = releaseHistory.getOperationContext();
Object rules = context.get("rules");
List<GrayReleaseRuleItemDTO>
ruleItems = rules == null ?
null : gson.fromJson(rules.toString(), GsonType.RULE_ITEMS);
ruleItems = rules == null ?
null : gson.fromJson(rules.toString(), GsonType.RULE_ITEMS);
StringBuilder rulesHtmlBuilder = new StringBuilder();
if (CollectionUtils.isEmpty(ruleItems)) {
rulesHtmlBuilder.append("无灰度规则");
return bodyTemplate.replaceAll(EMAIL_CONTENT_GRAY_RULES_MODULE, "<br><h4>无灰度规则</h4>");
} else {
StringBuilder rulesHtmlBuilder = new StringBuilder();
for (GrayReleaseRuleItemDTO ruleItem : ruleItems) {
String clientAppId = ruleItem.getClientAppId();
Set<String> ips = ruleItem.getClientIpList();
rulesHtmlBuilder.append("<b>AppId:&nbsp;</b>")
.append(clientAppId)
.append("&nbsp;&nbsp; <b>IP:&nbsp;</b>");
.append(clientAppId)
.append("&nbsp;&nbsp; <b>IP:&nbsp;</b>");
IP_JOINER.appendTo(rulesHtmlBuilder, ips);
}
}
String grayRulesModuleContent = portalConfig.emailGrayRulesModuleTemplate().replaceAll(EMAIL_CONTENT_GRAY_RULES_CONTENT,
Matcher.quoteReplacement(rulesHtmlBuilder.toString()));
return result.replaceAll(EMAIL_CONTENT_FIELD_RULE, Matcher.quoteReplacement(rulesHtmlBuilder.toString()));
return bodyTemplate.replaceAll(EMAIL_CONTENT_GRAY_RULES_MODULE, Matcher.quoteReplacement(grayRulesModuleContent));
}
}
}
......@@ -20,7 +20,16 @@ public class MergeEmailBuilder extends ConfigPublishEmailBuilder {
@Override
protected String emailContent(Env env, ReleaseHistoryBO releaseHistory) {
String template = getReleaseTemplate();
return renderEmailCommonContent(template, env, releaseHistory);
return renderEmailCommonContent(env, releaseHistory);
}
@Override
protected String getTemplateFramework() {
return portalConfig.emailTemplateFramework();
}
@Override
protected String getDiffModuleTemplate() {
return portalConfig.emailReleaseDiffModuleTemplate();
}
}
......@@ -20,7 +20,16 @@ public class NormalPublishEmailBuilder extends ConfigPublishEmailBuilder {
@Override
protected String emailContent(Env env, ReleaseHistoryBO releaseHistory) {
String template = getReleaseTemplate();
return renderEmailCommonContent(template, env, releaseHistory);
return renderEmailCommonContent(env, releaseHistory);
}
@Override
protected String getTemplateFramework() {
return portalConfig.emailTemplateFramework();
}
@Override
protected String getDiffModuleTemplate() {
return portalConfig.emailReleaseDiffModuleTemplate();
}
}
......@@ -20,7 +20,16 @@ public class RollbackEmailBuilder extends ConfigPublishEmailBuilder {
@Override
protected String emailContent(Env env, ReleaseHistoryBO releaseHistory) {
String template = getRollbackTemplate();
return renderEmailCommonContent(template, env, releaseHistory);
return renderEmailCommonContent(env, releaseHistory);
}
@Override
protected String getTemplateFramework() {
return portalConfig.emailTemplateFramework();
}
@Override
protected String getDiffModuleTemplate() {
return portalConfig.emailRollbackDiffModuleTemplate();
}
}
package com.ctrip.framework.apollo.portal.service;
import com.ctrip.framework.apollo.portal.components.config.PortalConfig;
import com.google.common.collect.Maps;
import com.google.gson.Gson;
......@@ -30,10 +31,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.HttpClientErrorException;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.*;
@Service
public class NamespaceService {
......@@ -42,8 +40,6 @@ public class NamespaceService {
private Gson gson = new Gson();
@Autowired
private PortalSettings portalSettings;
@Autowired
private UserInfoHolder userInfoHolder;
@Autowired
private ItemService itemService;
......@@ -53,6 +49,10 @@ public class NamespaceService {
private AdminServiceAPI.NamespaceAPI namespaceAPI;
@Autowired
private AppNamespaceService appNamespaceService;
@Autowired
private PortalConfig portalConfig;
@Autowired
private PortalSettings portalSettings;
public NamespaceDTO createNamespace(Env env, NamespaceDTO namespace) {
......@@ -138,9 +138,11 @@ public class NamespaceService {
public Map<String, Map<String, Boolean>> getNamespacesPublishInfo(String appId) {
Map<String, Map<String, Boolean>> result = Maps.newHashMap();
List<Env> envs = portalSettings.getActiveEnvs();
Set<Env> envs = portalConfig.publishTipsSupportedEnvs();
for (Env env: envs) {
result.put(env.toString(), namespaceAPI.getNamespacePublishInfo(env, appId));
if (portalSettings.isEnvActive(env)) {
result.put(env.toString(), namespaceAPI.getNamespacePublishInfo(env, appId));
}
}
return result;
......
......@@ -66,7 +66,10 @@ public class CtripEmailRequestBuilder {
setSender.invoke(emailRequest, email.getSenderEmailAddress());
setSubject.invoke(emailRequest, email.getSubject());
setBodyContent.invoke(emailRequest, email.getBody());
String emailBodyBuilder = "<entry><content><![CDATA[<!DOCTYPE html>" +
email.getBody() +
"]]></content></entry>";
setBodyContent.invoke(emailRequest, emailBodyBuilder);
setRecipient.invoke(emailRequest, email.getRecipients());
return emailRequest;
......
......@@ -21,6 +21,7 @@ public class CtripEmailService implements EmailService {
private Object emailServiceClient;
private Method sendEmailAsync;
private Method sendEmail;
@Autowired
private CtripEmailRequestBuilder emailRequestBuilder;
......@@ -33,13 +34,15 @@ public class CtripEmailService implements EmailService {
initServiceClientConfig();
Class emailServiceClientClazz =
Class.forName("com.ctrip.framework.apolloctripservice.emailservice.EmailServiceClient");
Class.forName("com.ctrip.framework.apolloctripservice.emailservice.EmailServiceClient");
Method getInstanceMethod = emailServiceClientClazz.getMethod("getInstance");
emailServiceClient = getInstanceMethod.invoke(null);
Class sendEmailRequestClazz =
Class.forName("com.ctrip.framework.apolloctripservice.emailservice.SendEmailRequest");
Class.forName("com.ctrip.framework.apolloctripservice.emailservice.SendEmailRequest");
sendEmailAsync = emailServiceClientClazz.getMethod("sendEmailAsync", sendEmailRequestClazz);
sendEmail = emailServiceClientClazz.getMethod("sendEmail", sendEmailRequestClazz);
} catch (Throwable e) {
logger.error("init ctrip email service failed", e);
Tracer.logError("init ctrip email service failed", e);
......@@ -64,9 +67,12 @@ public class CtripEmailService implements EmailService {
try {
Object emailRequest = emailRequestBuilder.buildEmailRequest(email);
Object sendResponse = sendEmailAsync.invoke(emailServiceClient, emailRequest);
logger.info("Email sender response:" + sendResponse);
Object sendResponse = portalConfig.isSendEmailAsync() ?
sendEmailAsync.invoke(emailServiceClient, emailRequest) :
sendEmail.invoke(emailServiceClient, emailRequest);
logger.info("Email server response: " + sendResponse);
} catch (Throwable e) {
logger.error("send email failed", e);
......
package com.ctrip.framework.apollo.portal.spi.ctrip;
import com.ctrip.framework.apollo.portal.spi.ctrip.filters.UserAccessFilter;
import com.google.common.base.Strings;
import com.ctrip.framework.apollo.portal.components.config.PortalConfig;
import com.ctrip.framework.apollo.portal.spi.UserInfoHolder;
import com.ctrip.framework.apollo.portal.spi.ctrip.filters.RecordAccessUserFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.embedded.FilterRegistrationBean;
......@@ -47,10 +47,10 @@ public class WebContextConfiguration {
}
@Bean
public FilterRegistrationBean recordAccessUserFilter() {
public FilterRegistrationBean userAccessFilter() {
FilterRegistrationBean filter = new FilterRegistrationBean();
filter.setFilter(new RecordAccessUserFilter(userInfoHolder));
filter.addUrlPatterns("/apps");
filter.setFilter(new UserAccessFilter(userInfoHolder));
filter.addUrlPatterns("/*");
return filter;
}
......
......@@ -3,23 +3,19 @@ package com.ctrip.framework.apollo.portal.spi.ctrip.filters;
import com.ctrip.framework.apollo.portal.constant.CatEventType;
import com.ctrip.framework.apollo.portal.spi.UserInfoHolder;
import com.ctrip.framework.apollo.tracer.Tracer;
import com.google.common.base.Strings;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class RecordAccessUserFilter implements Filter {
public class UserAccessFilter implements Filter {
private static final String STATIC_RESOURCE_REGEX = ".*\\.(js|html|htm|png|css|woff2)$";
private UserInfoHolder userInfoHolder;
public RecordAccessUserFilter(UserInfoHolder userInfoHolder) {
public UserAccessFilter(UserInfoHolder userInfoHolder) {
this.userInfoHolder = userInfoHolder;
}
......@@ -30,9 +26,13 @@ public class RecordAccessUserFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
throws IOException, ServletException {
String requestUri = ((HttpServletRequest) request).getRequestURI();
Tracer.logEvent(CatEventType.USER_ACCESS, userInfoHolder.getUser().getUserId());
if (!isStaticResource(requestUri)) {
Tracer.logEvent(CatEventType.USER_ACCESS, userInfoHolder.getUser().getUserId());
}
chain.doFilter(request, response);
}
......@@ -41,4 +41,9 @@ public class RecordAccessUserFilter implements Filter {
public void destroy() {
}
private boolean isStaticResource(String uri) {
return !Strings.isNullOrEmpty(uri) && uri.matches(STATIC_RESOURCE_REGEX);
}
}
......@@ -17,12 +17,12 @@ $(document).ready(function () {
$('[data-tooltip="tooltip"]').tooltip({
trigger : 'hover'
});
}, 2500);
setTimeout(function () {
$("textarea").niceScroll({cursoropacitymax: 0});
$("pre").niceScroll({cursoropacitymax: 0});
}, 1000);
setTimeout(function () {
$(".release-history-list").niceScroll({cursoropacitymax: 0});
}, 2500);
......
......@@ -143,7 +143,7 @@
<dependency>
<groupId>com.dianping.cat</groupId>
<artifactId>cat-client</artifactId>
<version>2.1.2</version>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.unidal.framework</groupId>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment