Skip to content

Commit 386c2b2

Browse files
author
chenyijiang
committed
Resolve recursive dependency in log appender.
1 parent b1ec67e commit 386c2b2

File tree

11 files changed

+120
-50
lines changed

11 files changed

+120
-50
lines changed

capa-spi-aws-config/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
<parent>
2424
<artifactId>capa-aws-parent</artifactId>
2525
<groupId>group.rxcloud</groupId>
26-
<version>1.10.12.4.RELEASE</version>
26+
<version>1.11.13.2.RELEASE</version>
2727
</parent>
2828

2929
<artifactId>capa-spi-aws-config</artifactId>

capa-spi-aws-infrastructure/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
<parent>
2424
<artifactId>capa-aws-parent</artifactId>
2525
<groupId>group.rxcloud</groupId>
26-
<version>1.10.12.4.RELEASE</version>
26+
<version>1.11.13.2.RELEASE</version>
2727
</parent>
2828

2929
<artifactId>capa-spi-aws-infrastructure</artifactId>

capa-spi-aws-log/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
<parent>
2424
<artifactId>capa-aws-parent</artifactId>
2525
<groupId>group.rxcloud</groupId>
26-
<version>1.10.12.4.RELEASE</version>
26+
<version>1.11.13.2.RELEASE</version>
2727
</parent>
2828

2929
<artifactId>capa-spi-aws-log</artifactId>

capa-spi-aws-log/src/main/java/group/rxcloud/capa/spi/aws/log/appender/CapaAwsLog4jAppender.java

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,24 +36,31 @@
3636
import java.util.concurrent.atomic.AtomicBoolean;
3737

3838
public class CapaAwsLog4jAppender extends CapaLog4jAppenderSpi {
39+
3940
/**
4041
* The error type name of the log4j appender.
4142
*/
4243
protected static final String LOG_LOG4J_APPENDER_ERROR_TYPE = "Log4jAppendLogsError";
44+
4345
/**
4446
* Number of counts each time.
4547
*/
4648
protected static final Integer COUNTER_NUM = 1;
49+
4750
/**
4851
* The namespace for logging error.
4952
* TODO Set variables to common variables
5053
*/
5154
private static final String LOG_ERROR_NAMESPACE = "CloudWatchLogs";
55+
5256
/**
5357
* The metric name for logging error.
5458
* TODO Set variables to common variables
5559
*/
5660
private static final String LOG_ERROR_METRIC_NAME = "LogError";
61+
62+
private static final AtomicBoolean METRIC_INIT = new AtomicBoolean(false);
63+
5764
/**
5865
* Init an instance of {@link LongCounter}.
5966
*/
@@ -63,8 +70,6 @@ public class CapaAwsLog4jAppender extends CapaLog4jAppenderSpi {
6370
PluginManager.addPackage("group.rxcloud.capa.spi.aws.log.appender");
6471
}
6572

66-
private static final AtomicBoolean METRIC_INIT = new AtomicBoolean(false);
67-
6873
static Optional<LongCounter> getCounterOpt() {
6974
if (METRIC_INIT.get()) {
7075
return LONG_COUNTER;
@@ -77,9 +82,10 @@ static Optional<LongCounter> getCounterOpt() {
7782
LONG_COUNTER = Optional.ofNullable(longCounter);
7883
});
7984
}
80-
return LONG_COUNTER;
8185
}
86+
return LONG_COUNTER;
8287
}
88+
8389
@Override
8490
public void appendLog(LogEvent event) {
8591
try {
@@ -89,21 +95,23 @@ public void appendLog(LogEvent event) {
8995
return;
9096
}
9197
Optional<CapaLogLevel> capaLogLevel = CapaLogLevel.toCapaLogLevel(event.getLevel().name());
92-
if(capaLogLevel.isPresent() && LogManager.logsCanOutput(capaLogLevel.get())){
98+
if (capaLogLevel.isPresent() && LogManager.logsCanOutput(capaLogLevel.get())) {
9399
String message = event.getMessage().getFormattedMessage();
94100
ReadOnlyStringMap contextData = event.getContextData();
95101
Map<String, String> MDCTags = contextData == null ? new HashMap<>() : contextData.toMap();
96-
LogAppendManager.appendLogs(message, MDCTags, event.getLevel().name(), event.getThrown());
102+
LogAppendManager.appendLogs(message, MDCTags, event.getLoggerName(), event.getThreadName(),
103+
event.getLevel().name(), event.getTimeMillis(), event.getThrown());
97104
}
98105
} catch (Exception e) {
99106
try {
100107
CustomLogManager.error("CapaAwsLog4jAppender appender log error.", e);
101108
//Enhance function without affecting function
102109
getCounterOpt().ifPresent(longCounter -> {
103-
longCounter.bind(Attributes.of(AttributeKey.stringKey(LOG_LOG4J_APPENDER_ERROR_TYPE), e.getClass().getName()))
104-
.add(COUNTER_NUM);
110+
longCounter.bind(Attributes
111+
.of(AttributeKey.stringKey(LOG_LOG4J_APPENDER_ERROR_TYPE), e.getClass().getName()))
112+
.add(COUNTER_NUM);
105113
});
106-
} finally {
114+
} catch (Throwable ex) {
107115
}
108116

109117
}

capa-spi-aws-log/src/main/java/group/rxcloud/capa/spi/aws/log/appender/CapaAwsLogbackAppender.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,23 +44,26 @@ public class CapaAwsLogbackAppender extends CapaLogbackAppenderSpi {
4444
* Number of counts each time.
4545
*/
4646
protected static final Integer COUNTER_NUM = 1;
47+
4748
/**
4849
* The namespace for logging error.
4950
* TODO Set variables to common variables
5051
*/
5152
private static final String LOG_ERROR_NAMESPACE = "CloudWatchLogs";
53+
5254
/**
5355
* The metric name for logging error.
5456
* TODO Set variables to common variables
5557
*/
5658
private static final String LOG_ERROR_METRIC_NAME = "LogError";
59+
60+
private static final AtomicBoolean METRIC_INIT = new AtomicBoolean(false);
61+
5762
/**
5863
* Init an instance of {@link LongCounter}.
5964
*/
6065
protected static Optional<LongCounter> LONG_COUNTER = Optional.empty();
6166

62-
private static final AtomicBoolean METRIC_INIT = new AtomicBoolean(false);
63-
6467
static Optional<LongCounter> getCounterOpt() {
6568
if (METRIC_INIT.get()) {
6669
return LONG_COUNTER;
@@ -73,8 +76,8 @@ static Optional<LongCounter> getCounterOpt() {
7376
LONG_COUNTER = Optional.ofNullable(longCounter);
7477
});
7578
}
76-
return LONG_COUNTER;
7779
}
80+
return LONG_COUNTER;
7881
}
7982

8083
@Override
@@ -87,16 +90,18 @@ public void appendLog(ILoggingEvent event) {
8790
if (capaLogLevel.isPresent() && LogManager.logsCanOutput(capaLogLevel.get())) {
8891
String message = event.getFormattedMessage();
8992
Map<String, String> MDCTags = event.getMDCPropertyMap();
90-
LogAppendManager.appendLogs(message, MDCTags, event.getLevel().levelStr, getThrowable(event));
93+
LogAppendManager.appendLogs(message, MDCTags, event.getLoggerName(), event.getThreadName(),
94+
event.getLevel().levelStr, event.getTimeStamp(), getThrowable(event));
9195
}
9296
} catch (Exception e) {
9397
CustomLogManager.error("CapaAwsLogbackAppender appender log error.", e);
9498
getCounterOpt().ifPresent(longCounter -> {
9599
try {
96100
//Enhance function without affecting function
97-
longCounter.bind(Attributes.of(AttributeKey.stringKey(LOG_LOGBACK_APPENDER_ERROR_TYPE), e.getClass().getName()))
98-
.add(COUNTER_NUM);
99-
} finally {
101+
longCounter.bind(Attributes
102+
.of(AttributeKey.stringKey(LOG_LOGBACK_APPENDER_ERROR_TYPE), e.getClass().getName()))
103+
.add(COUNTER_NUM);
104+
} catch (Throwable ex) {
100105
}
101106
});
102107
}

capa-spi-aws-log/src/main/java/group/rxcloud/capa/spi/aws/log/manager/LogAppendManager.java

Lines changed: 68 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -21,79 +21,104 @@
2121
import group.rxcloud.capa.addons.foundation.FoundationType;
2222
import group.rxcloud.capa.component.telemetry.context.CapaContext;
2323
import group.rxcloud.capa.infrastructure.hook.Mixer;
24-
import group.rxcloud.capa.infrastructure.hook.TelemetryHooks;
2524
import group.rxcloud.capa.spi.aws.log.configuration.LogConfiguration;
2625
import group.rxcloud.capa.spi.aws.log.handle.MessageConsumer;
2726
import group.rxcloud.capa.spi.aws.log.handle.MessageManager;
28-
import io.opentelemetry.api.metrics.LongCounter;
29-
import io.opentelemetry.api.metrics.Meter;
27+
import io.opentelemetry.api.trace.Span;
28+
import io.opentelemetry.api.trace.TraceId;
29+
import io.opentelemetry.api.trace.Tracer;
3030
import software.amazon.awssdk.utils.StringUtils;
3131

3232
import java.io.PrintWriter;
3333
import java.io.StringWriter;
34+
import java.time.Instant;
35+
import java.time.ZoneId;
36+
import java.time.ZonedDateTime;
37+
import java.time.format.DateTimeFormatter;
3438
import java.util.HashMap;
3539
import java.util.Map;
3640
import java.util.Optional;
3741

3842
public class LogAppendManager {
43+
3944
/**
4045
* Tag identifier prefix.
4146
*/
4247
protected static final String TAG_PREFIX = "[[";
48+
4349
/**
4450
* Tag identifier suffix.
4551
*/
4652
protected static final String TAG_SUFFIX = "]]";
53+
4754
/**
4855
* The name of log source data.
4956
*/
5057
protected static final String LOG_DATA_NAME = "logData";
58+
5159
protected static final String ERROR_NAME = "errorName";
5260

5361
/**
5462
* The name of log level.
5563
*/
5664
protected static final String LOG_LEVEL_NAME = "logLevel";
65+
66+
/**
67+
* The name of logger.
68+
*/
69+
protected static final String LOGGER_NAME = "loggerName";
70+
71+
/**
72+
* The name of thread.
73+
*/
74+
protected static final String THREAD_NAME = "threadName";
75+
76+
/**
77+
* The time of log.
78+
*/
79+
protected static final String LOG_TIME = "logTime";
80+
5781
/**
5882
* The name of log's _trace_id.
5983
*/
6084
protected static final String TRACE_ID_NAME = "_trace_id";
6185

6286
protected static final String APP_ID_NAME = "appId";
87+
6388
protected static final String PUT_LOG_ASYNC_SWITCH = "putLogAsyncSwitch";
6489

6590

6691
/**
6792
* Init a {@link Gson} instance.
6893
*/
6994
private static final Gson GSON = new Gson();
70-
/**
71-
* The instance of the {@link TelemetryHooks}.
72-
*/
73-
private static final Optional<TelemetryHooks> TELEMETRY_HOOKS;
95+
7496
/**
7597
* The namespace for logging error.
7698
*/
7799
private static final String LOG_ERROR_NAMESPACE = "CloudWatchLogs";
78-
/**
79-
* The metric name for logging error.
80-
*/
81-
private static final String LOG_ERROR_METRIC_NAME = "LogError";
82-
/**
83-
* Init an instance of {@link LongCounter}.
84-
*/
85-
protected static Optional<LongCounter> LONG_COUNTER = Optional.empty();
100+
101+
102+
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSZ");
103+
104+
105+
private static Optional<Tracer> TRACER = Optional.empty();
86106

87107
/**
88108
* Init telemetry hooks and longCounter.
89109
*/
90-
static {
91-
TELEMETRY_HOOKS = Mixer.telemetryHooksNullable();
92-
TELEMETRY_HOOKS.ifPresent(telemetryHooks -> {
93-
Meter meter = telemetryHooks.buildMeter(LOG_ERROR_NAMESPACE).block();
94-
LongCounter longCounter = meter.counterBuilder(LOG_ERROR_METRIC_NAME).build();
95-
LONG_COUNTER = Optional.ofNullable(longCounter);
96-
});
110+
111+
private static void tryInitTelemetryTracer() {
112+
if (!TRACER.isPresent()) {
113+
try {
114+
Mixer.telemetryHooksNullable().ifPresent(telemetryHooks -> {
115+
TRACER = Optional.ofNullable(telemetryHooks.buildTracer(LOG_ERROR_NAMESPACE).block());
116+
});
117+
} catch (Throwable ex) {
118+
CustomLogManager.error("Fail to init telemetry tracer.", ex);
119+
}
120+
121+
}
97122
}
98123

99124
protected static Map<String, String> parseTags(String message, int tagsEndIndex) {
@@ -130,8 +155,12 @@ protected static Map<String, String> appendMDCTags(Map<String, String> tags, Map
130155
return tags;
131156
}
132157

133-
public static void appendLogs(String message, Map<String, String> MDCTags, String logLevel, Throwable throwable) {
158+
public static void appendLogs(String message, Map<String, String> MDCTags, String loggerName, String threadName,
159+
String logLevel, long timestamp, Throwable throwable) {
134160
Map<String, String> logMessageMap = parseLogs(message, MDCTags, logLevel, throwable);
161+
logMessageMap.put(LOGGER_NAME, loggerName);
162+
logMessageMap.put(THREAD_NAME, threadName);
163+
logMessageMap.put(LOG_TIME, ZonedDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.systemDefault()).format(FORMATTER));
135164
// put logs to CloudWatchLogs
136165
if (!logMessageMap.isEmpty()) {
137166
String logMessage = GSON.toJson(logMessageMap);
@@ -145,7 +174,8 @@ public static void appendLogs(String message, Map<String, String> MDCTags, Strin
145174
}
146175
}
147176

148-
public static Map<String,String> parseLogs(String message, Map<String, String> MDCTags, String logLevel, Throwable throwable){
177+
public static Map<String, String> parseLogs(String message, Map<String, String> MDCTags, String logLevel,
178+
Throwable throwable) {
149179
if (StringUtils.isBlank(message)) {
150180
message = "";
151181
}
@@ -186,9 +216,21 @@ public static Map<String,String> parseLogs(String message, Map<String, String> M
186216
protected static Map<String, String> getDefaultTags() {
187217
Map<String, String> defaultTags = new HashMap<>();
188218
// traceId
189-
if (StringUtils.isNotBlank(CapaContext.getTraceId())) {
190-
defaultTags.put(TRACE_ID_NAME, CapaContext.getTraceId());
219+
String traceId = CapaContext.getTraceId();
220+
if (StringUtils.isNotBlank(traceId) || TraceId.getInvalid().equals(traceId)) {
221+
if (!TRACER.isPresent()) {
222+
tryInitTelemetryTracer();
223+
}
224+
if (TRACER.isPresent()) {
225+
Span span = TRACER.get().spanBuilder("CapaLog").startSpan();
226+
traceId = span.getSpanContext().getTraceId();
227+
span.end();
228+
}
191229
}
230+
if (StringUtils.isNotBlank(traceId)) {
231+
defaultTags.put(TRACE_ID_NAME, traceId);
232+
}
233+
192234
// appId
193235
String appId = CapaFoundation.getAppId(FoundationType.TRIP);
194236
if (StringUtils.isNotBlank(appId)) {

capa-spi-aws-mesh/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
<parent>
2424
<artifactId>capa-aws-parent</artifactId>
2525
<groupId>group.rxcloud</groupId>
26-
<version>1.10.12.4.RELEASE</version>
26+
<version>1.11.13.2.RELEASE</version>
2727
</parent>
2828

2929
<artifactId>capa-spi-aws-mesh</artifactId>

capa-spi-aws-telemetry/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
<parent>
2424
<artifactId>capa-aws-parent</artifactId>
2525
<groupId>group.rxcloud</groupId>
26-
<version>1.10.12.4.RELEASE</version>
26+
<version>1.11.13.2.RELEASE</version>
2727
</parent>
2828

2929
<artifactId>capa-spi-aws-telemetry</artifactId>

capa-spi-aws-telemetry/src/main/java/group/rxcloud/capa/spi/aws/telemetry/metrics/CloudWatchMetricsExporter.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ public class CloudWatchMetricsExporter extends CapaMetricsExporterSpi {
7373

7474
private static final String APPID = "AppId";
7575

76+
private static final String ENV = "Env";
77+
7678
private static final String UNKNOWN = "UNKNOWN";
7779

7880
public CloudWatchMetricsExporter(Supplier<SamplerConfig> samplerConfig) {
@@ -96,12 +98,25 @@ private static String getAppId() {
9698
}
9799
}
98100

101+
private static String getEnv() {
102+
try {
103+
String env = CapaFoundation.getEnv(FoundationType.TRIP);
104+
return env == null ? UNKNOWN : env;
105+
} catch (Throwable e) {
106+
return UNKNOWN;
107+
}
108+
}
109+
99110
static List<Dimension> buildDimension(Attributes attributes) {
100111
List<Dimension> dimensions = new ArrayList<>();
101112
dimensions.add(Dimension.builder()
102113
.name(APPID)
103114
.value(getAppId())
104115
.build());
116+
dimensions.add(Dimension.builder()
117+
.name(ENV)
118+
.value(getEnv())
119+
.build());
105120
if (attributes.isEmpty()) {
106121
return dimensions;
107122
}

0 commit comments

Comments
 (0)