完成Redis告警问题
This commit is contained in:
parent
108c38bcbb
commit
dbec9c194a
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 校验Context,Context是否存在
|
||||
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 {
|
||||
|
|
|
|||
|
|
@ -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("-", "");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,7 @@
|
|||
package com.ai.cloud.skywalking.example.web;
|
||||
|
||||
/**
|
||||
* Created by astraea on 2015/11/26.
|
||||
*/
|
||||
public class SaveOrderServlet {
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
Loading…
Reference in New Issue