完成Redis告警问题

This commit is contained in:
zhangxin10 2015-12-03 14:34:45 +08:00
parent 108c38bcbb
commit dbec9c194a
14 changed files with 96 additions and 68 deletions

View File

@ -28,10 +28,12 @@ public class ThreadBuriedPointSender implements IBuriedPointSender {
// 从ThreadLocal中取出上下文
final Span parentSpanData = Context.getLastSpan();
if (parentSpanData == null) {
spanData = new Span(TraceIdGenerator.generate(), Config.SkyWalking.APPLICATION_ID);
spanData = new Span(TraceIdGenerator.generate(), Config.SkyWalking.APPLICATION_ID,
Config.SkyWalking.USER_ID);
} else {
// 如果不为空则将当前的Context存放到上下文
spanData = new Span(parentSpanData.getTraceId(), Config.SkyWalking.APPLICATION_ID);
spanData = new Span(parentSpanData.getTraceId(), Config.SkyWalking.APPLICATION_ID,
Config.SkyWalking.USER_ID);
spanData.setParentLevel(parentSpanData.getParentLevel() + "." + parentSpanData.getLevelId());
spanData.setLevelId(threadSeqId);
}

View File

@ -31,10 +31,10 @@ public final class ContextGenerator {
// 校验传入的参数是否为空如果为空则新创建一个
if (context == null || StringUtil.isEmpty(context.getTraceId())) {
// 不存在新创建一个Context
spanData = new Span(TraceIdGenerator.generate(), Config.SkyWalking.APPLICATION_ID);
spanData = new Span(TraceIdGenerator.generate(), Config.SkyWalking.APPLICATION_ID, Config.SkyWalking.USER_ID);
} else {
// 如果不为空则将当前的Context存放到上下文
spanData = new Span(context.getTraceId(), context.getParentLevel(), context.getLevelId(), Config.SkyWalking.APPLICATION_ID);
spanData = new Span(context.getTraceId(), context.getParentLevel(), context.getLevelId(), Config.SkyWalking.APPLICATION_ID, Config.SkyWalking.USER_ID);
}
initNewSpanData(spanData, id);
@ -58,12 +58,12 @@ public final class ContextGenerator {
// 2 校验ContextContext是否存在
if (parentSpan == null) {
// 不存在新创建一个Context
span = new Span(TraceIdGenerator.generate(), Config.SkyWalking.APPLICATION_ID);
span = new Span(TraceIdGenerator.generate(), Config.SkyWalking.APPLICATION_ID, Config.SkyWalking.USER_ID);
} else {
// 根据ParentContextData的TraceId和RPCID
// LevelId是由SpanNode类的nextSubSpanLevelId字段进行初始化的.
// 所以在这里不需要初始化
span = new Span(parentSpan.getTraceId(), Config.SkyWalking.APPLICATION_ID);
span = new Span(parentSpan.getTraceId(), Config.SkyWalking.APPLICATION_ID, Config.SkyWalking.USER_ID);
if (!StringUtil.isEmpty(parentSpan.getParentLevel())) {
span.setParentLevel(parentSpan.getParentLevel() + "." + parentSpan.getLevelId());
} else {

View File

@ -10,6 +10,6 @@ public final class TraceIdGenerator {
}
public static String generate() {
return UUID.randomUUID().toString().replaceAll("-", "") + Config.SkyWalking.USER_ID;
return UUID.randomUUID().toString().replaceAll("-", "");
}
}

View File

@ -0,0 +1,7 @@
package com.ai.cloud.skywalking.example.web;
/**
* Created by astraea on 2015/11/26.
*/
public class SaveOrderServlet {
}

View File

@ -13,15 +13,17 @@ public class Span extends SpanData {
public Span() {
}
public Span(String traceId, String applicationID) {
public Span(String traceId, String applicationID, String userId) {
this.traceId = traceId;
this.applicationId = applicationID;
this.userId = userId;
}
public Span(String traceId, String parentLevelId, int levelId, String applicationID) {
public Span(String traceId, String parentLevelId, int levelId, String applicationID, String userId) {
this.traceId = traceId;
this.applicationId = applicationID;
this.parentLevel = parentLevelId;
this.userId = userId;
this.levelId = levelId;
}
@ -47,6 +49,7 @@ public class Span extends SpanData {
NEW_LINE_CHARACTER_PATTERN);
processNo = fieldValues[12].trim();
applicationId = fieldValues[13].trim();
userId = fieldValues[14].trim();
this.originData = originData;
}
@ -114,7 +117,13 @@ public class Span extends SpanData {
}
if (isNonBlank(applicationId)) {
toStringValue.append(applicationId);
toStringValue.append(applicationId + SPAN_FIELD_SPILT_PATTERN);
} else {
toStringValue.append(" " + SPAN_FIELD_SPILT_PATTERN);
}
if (isNonBlank(userId)) {
toStringValue.append(userId);
} else {
toStringValue.append(" " + SPAN_FIELD_SPILT_PATTERN);
}

View File

@ -22,6 +22,7 @@ public abstract class SpanData {
protected String processNo = "";
protected String applicationId = "";
protected String originData = "";
protected String userId;
public String getTraceId() {
@ -124,4 +125,7 @@ public abstract class SpanData {
return applicationId;
}
public String getUserId() {
return userId;
}
}

View File

@ -97,5 +97,7 @@ public class Config {
public static int REDIS_MIN_IDLE = 1;
public static int REDIS_MAX_TOTAL = 20;
public static boolean ALARM_OFF_FLAG = false;
}
}

View File

@ -72,17 +72,7 @@ public class PersistenceThread extends Thread {
offset += 1;
continue;
}
//
// if (tmpData == null || tmpData.length() <= 0) {
// MemoryRegister
// .instance()
// .doRegisterStatus(
// new FileRegisterEntry(
// file1.getName(),
// offset,
// FileRegisterEntry.FileRegisterEntryStatus.UNREGISTER));
// break;
// }
ServerHealthCollector.getCurrentHeathReading(null)
.updateData(
ServerHeathReading.INFO,

View File

@ -3,6 +3,7 @@ package com.ai.cloud.skywalking.reciever.storage;
import com.ai.cloud.skywalking.protocol.Span;
import com.ai.cloud.skywalking.reciever.conf.Config;
import com.ai.cloud.skywalking.reciever.conf.Constants;
import com.ai.cloud.skywalking.reciever.storage.chain.AlarmChain;
import com.ai.cloud.skywalking.reciever.storage.chain.SaveToHBaseChain;
import com.ai.cloud.skywalking.reciever.storage.chain.SaveToMySQLChain;
import org.apache.logging.log4j.LogManager;
@ -21,6 +22,7 @@ public class StorageChainController {
static {
if (STORAGE_TYPE.equalsIgnoreCase("hbase")) {
chainArray.add(new AlarmChain());
chainArray.add(new SaveToHBaseChain());
} else if (STORAGE_TYPE.equalsIgnoreCase("mysql")) {
chainArray.add(new SaveToMySQLChain());

View File

@ -0,0 +1,38 @@
package com.ai.cloud.skywalking.reciever.storage.chain;
import com.ai.cloud.skywalking.protocol.Span;
import com.ai.cloud.skywalking.reciever.conf.Config;
import com.ai.cloud.skywalking.reciever.storage.Chain;
import com.ai.cloud.skywalking.reciever.storage.IStorageChain;
import com.ai.cloud.skywalking.reciever.storage.chain.alarm.AlarmMessageStorage;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.List;
public class AlarmChain implements IStorageChain {
private Logger logger = LogManager.getLogger(AlarmChain.class);
@Override
public void doChain(List<Span> spans, Chain chain) {
if (Config.Alarm.ALARM_OFF_FLAG) {
chain.doChain(spans);
return;
}
for (Span span : spans) {
if (span.getStatusCode() != 1)
continue;
AlarmMessageStorage.saveAlarmMessage(
generateAlarmKey(span)
, span.getTraceId());
}
chain.doChain(spans);
}
private String generateAlarmKey(Span span) {
return span.getUserId() + "-"
+ span.getApplicationId() + "-"
+ (System.currentTimeMillis() / (10000 * 6));
}
}

View File

@ -1,5 +1,6 @@
package com.ai.cloud.skywalking.reciever.storage.chain.alarm;
import com.ai.cloud.skywalking.reciever.conf.Config;
import redis.clients.jedis.Jedis;
import java.util.Collection;
@ -54,11 +55,8 @@ public class AlarmMessageStorage {
public static void saveAlarmMessage(String key, String traceId) {
if (Config.Alarm.ALARM_OFF_FLAG)
return;
set(key, traceId, "");
}
public static Collection<String> getAlarmMessage(String key) {
return get(key);
}
}

View File

@ -6,25 +6,29 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.exceptions.JedisConnectionException;
public class RedisAccessController {
private static Logger logger = LogManager.getLogger(RedisAccessController.class);
private static JedisPool jedisPool;
private static Object lock = new Object();
static {
GenericObjectPoolConfig genericObjectPoolConfig = buildGenericObjectPoolConfig();
String redisServerConfig = Config.Alarm.REDIS_SERVER_CONFIG;
if (redisServerConfig == null || redisServerConfig.length() <= 0) {
logger.error("Redis server config is null.");
Config.Alarm.ALARM_OFF_FLAG = true;
}
String[] config = redisServerConfig.split(":");
if (config.length != 2) {
logger.error("Redis server config is illegal");
Config.Alarm.ALARM_OFF_FLAG = true;
}
jedisPool =
new JedisPool(genericObjectPoolConfig, config[0], Integer.valueOf(config[1]));
@ -42,48 +46,12 @@ public class RedisAccessController {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
jedis.connect();
return executor.exec(jedis);
} catch (Exception e) {
jedisPool = null;
logger.error("Failed to connect redis", e);
// 启动备用Redis
if (jedisPool == null) {
synchronized (lock) {
if (jedisPool == null) {
// 生成备份Redis的Redis Client Pool
GenericObjectPoolConfig genericObjectPoolConfig = buildGenericObjectPoolConfig();
String bakRedisServerConfig = Config.Alarm.BAK_REDIS_SERVER_CONFIG;
if (bakRedisServerConfig == null || bakRedisServerConfig.length() <= 0) {
logger.error("Bak Redis server config is null.");
}
String[] config = bakRedisServerConfig.split(":");
if (config.length != 2) {
logger.error("Bak Redis server config is illegal");
}
jedisPool =
new JedisPool(genericObjectPoolConfig, config[0], Integer.valueOf(config[1]));
try {
jedis = jedisPool.getResource();
jedis.connect();
jedis.get("ok");
} catch (Exception ex) {
logger.error("Failed to connect bak redis server.", ex);
// 备份Redis的都失败了没有想好怎么提示
//System.exit(-1);
} finally {
if (jedis != null) {
jedis.close();
}
}
}
}
// 重新再获取Redis Client返回执行
jedis = jedisPool.getResource();
jedis.connect();
return executor.exec(jedis);
logger.error("Failed to set data.", e);
if (e instanceof JedisConnectionException) {
logger.error("Failed to connect redis. close alarm function.", e);
Config.Alarm.ALARM_OFF_FLAG = true;
}
} finally {
if (jedis != null) {

View File

@ -45,4 +45,12 @@ hbaseconfig.client_port=29181
#告警失效时间
alarm.alarm_expire_seconds=3600000
#Redis配置
alarm.redis_server_config=127.0.0.1:6379
alarm.redis_server_config=127.0.0.1:16379
#Redis最大空闲数量
alarm.edis_max_idle=10
#Redis最小空闲数量
alarm.edis_min_idle=1
#Redis最大个数
alarm.edis_max_total=20
#是否关闭告警
alarm.larm_off_flag=false