Skip to content

Commit e1cb029

Browse files
author
yuqian.wjm
committed
支持span event
1 parent 6c5d02b commit e1cb029

File tree

7 files changed

+220
-122
lines changed

7 files changed

+220
-122
lines changed

tracer-core/src/main/java/com/alipay/common/tracer/core/SofaTracer.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,7 @@
3939
import io.opentracing.Tracer;
4040
import io.opentracing.propagation.Format;
4141

42-
import java.util.ArrayList;
43-
import java.util.Collections;
44-
import java.util.HashMap;
45-
import java.util.List;
46-
import java.util.Map;
42+
import java.util.*;
4743
import java.util.concurrent.ConcurrentHashMap;
4844

4945
import static com.alipay.common.tracer.core.constants.SofaTracerConstant.SPACE_ID;

tracer-core/src/main/java/com/alipay/common/tracer/core/constants/SofaTracerConstant.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,4 +122,9 @@ public class SofaTracerConstant {
122122
public static final String STAT_FLAG_FAILS = DIGEST_FLAG_FAILS;
123123

124124
public static final String SPACE_ID = "sofa-tracer";
125+
126+
/**
127+
* The constant MAX_SPAN_EVENT_NUM.
128+
*/
129+
public static final int MAX_SPAN_EVENT_NUM = 100;
125130
}

tracer-core/src/main/java/com/alipay/common/tracer/core/span/SofaTracerSpan.java

Lines changed: 54 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
import java.util.Map;
4141
import java.util.concurrent.ConcurrentHashMap;
4242
import java.util.concurrent.ConcurrentLinkedQueue;
43+
import java.util.concurrent.atomic.AtomicInteger;
44+
import java.util.concurrent.locks.Lock;
4345

4446
/**
4547
* SofaTracerSpan
@@ -70,13 +72,13 @@ public class SofaTracerSpan implements Span {
7072
*/
7173
private final Map<String, Number> tagsWithNumber = new ConcurrentHashMap<>();
7274

73-
private final Map<String, String> eventTagWithStr = new ConcurrentHashMap<>();
75+
private final ConcurrentLinkedQueue<LogData> logs = new ConcurrentLinkedQueue<>();
7476

75-
private final Map<String, Number> eventTagWithNumber = new ConcurrentHashMap<>();
77+
private final ConcurrentLinkedQueue<SpanEventData> events = new ConcurrentLinkedQueue<>();
7678

77-
private final Map<String, Boolean> eventTagWithBool = new ConcurrentHashMap<>();
79+
private SpanEventData eventData;
7880

79-
private final ConcurrentLinkedQueue<LogData> logs = new ConcurrentLinkedQueue<>();
81+
private final AtomicInteger eventNum = new AtomicInteger(0);
8082

8183
private String operationName = StringUtils.EMPTY_STRING;
8284

@@ -183,20 +185,46 @@ public void finish() {
183185
public void finish(long endTime) {
184186
this.setEndTime(endTime);
185187
//Key record:report span
188+
reportEvent();
186189
this.sofaTracer.reportSpan(this);
187190
SpanExtensionFactory.logStoppedSpan(this);
188191
}
189192

190193
/**
191-
* Report event.
194+
* Add event.
195+
*
196+
* @param eventData the event data
192197
*/
193-
public void reportEvent() {
198+
public void addEvent(SpanEventData eventData) {
199+
if (eventData == null) {
200+
SelfLog.error("event is null");
201+
return;
202+
}
203+
194204
if (this.endTime > 0 && System.currentTimeMillis() > this.endTime) {
195205
// span is closed, can not report event
196-
SelfLog.error("span is closed, can not report event");
206+
SelfLog.error("span is closed, can not add event");
207+
return;
208+
}
209+
210+
if (eventNum.incrementAndGet() > SofaTracerConstant.MAX_SPAN_EVENT_NUM) {
211+
SelfLog.error("span events exceed max num");
197212
return;
198213
}
199-
this.sofaTracer.reportEvent(this);
214+
215+
boolean result = this.events.offer(eventData);
216+
if (!result) {
217+
SelfLog.error("add event failed");
218+
}
219+
}
220+
221+
private void reportEvent() {
222+
SpanEventData spanEventData = events.poll();
223+
while (spanEventData != null) {
224+
this.eventData = spanEventData;
225+
this.sofaTracer.reportEvent(this);
226+
spanEventData = events.poll();
227+
}
200228
}
201229

202230
@Override
@@ -240,48 +268,6 @@ public Span setTag(String key, Number number) {
240268
return this;
241269
}
242270

243-
/**
244-
* Sets event tag.
245-
*
246-
* @param key the key
247-
* @param value the value
248-
* @return the event tag
249-
*/
250-
public Span setEventTag(String key, String value) {
251-
if (StringUtils.isBlank(key) || StringUtils.isBlank(value)) {
252-
return this;
253-
}
254-
this.eventTagWithStr.put(key, value);
255-
return this;
256-
}
257-
258-
/**
259-
* Sets event tag.
260-
*
261-
* @param key the key
262-
* @param value the value
263-
* @return the event tag
264-
*/
265-
public Span setEventTag(String key, boolean value) {
266-
this.eventTagWithBool.put(key, value);
267-
return this;
268-
}
269-
270-
/**
271-
* Sets event tag.
272-
*
273-
* @param key the key
274-
* @param number the number
275-
* @return the event tag
276-
*/
277-
public Span setEventTag(String key, Number number) {
278-
if (number == null) {
279-
return this;
280-
}
281-
this.eventTagWithNumber.put(key, number);
282-
return this;
283-
}
284-
285271
@Override
286272
public Span log(String eventValue) {
287273
//log with current time
@@ -560,33 +546,6 @@ public Map<String, Number> getTagsWithNumber() {
560546
return tagsWithNumber;
561547
}
562548

563-
/**
564-
* Gets event tag with number.
565-
*
566-
* @return the event tag with number
567-
*/
568-
public Map<String, Number> getEventTagWithNumber() {
569-
return eventTagWithNumber;
570-
}
571-
572-
/**
573-
* Gets event tag with bool.
574-
*
575-
* @return the event tag with bool
576-
*/
577-
public Map<String, Boolean> getEventTagWithBool() {
578-
return eventTagWithBool;
579-
}
580-
581-
/**
582-
* Gets event tag with str.
583-
*
584-
* @return the event tag with str
585-
*/
586-
public Map<String, String> getEventTagWithStr() {
587-
return eventTagWithStr;
588-
}
589-
590549
/**
591550
* Gets operation name.
592551
*
@@ -632,6 +591,24 @@ public void setLogType(String logType) {
632591
this.logType = logType;
633592
}
634593

594+
/**
595+
* Gets event data.
596+
*
597+
* @return the event data
598+
*/
599+
public SpanEventData getEventData() {
600+
return eventData;
601+
}
602+
603+
/**
604+
* Sets event data.
605+
*
606+
* @param eventData the event data
607+
*/
608+
public void setEventData(SpanEventData eventData) {
609+
this.eventData = eventData;
610+
}
611+
635612
/**
636613
* Gets parent sofa tracer span.
637614
*
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
/**
2+
* Ant Group
3+
* Copyright (c) 2004-2025 All Rights Reserved.
4+
*/
5+
package com.alipay.common.tracer.core.span;
6+
7+
import com.alipay.common.tracer.core.appender.self.Timestamp;
8+
import com.alipay.common.tracer.core.utils.StringUtils;
9+
10+
import java.io.Serializable;
11+
import java.util.Map;
12+
import java.util.concurrent.ConcurrentHashMap;
13+
14+
/**
15+
* The type Span event data.
16+
*
17+
* @author yuqian
18+
* @version : SpanEventData.java, v 0.1 2025-04-07 20:17 yuqian Exp $$
19+
*/
20+
public class SpanEventData implements Serializable {
21+
22+
private long timestamp;
23+
24+
private final Map<String, String> eventTagWithStr = new ConcurrentHashMap<>();
25+
26+
private final Map<String, Number> eventTagWithNumber = new ConcurrentHashMap<>();
27+
28+
private final Map<String, Boolean> eventTagWithBool = new ConcurrentHashMap<>();
29+
30+
31+
/**
32+
* Builder span event data builder.
33+
*
34+
* @return the span event data builder
35+
*/
36+
public static SpanEventDataBuilder builder() {
37+
return new SpanEventDataBuilder();
38+
}
39+
40+
/**
41+
* Gets timestamp.
42+
*
43+
* @return the timestamp
44+
*/
45+
public long getTimestamp() {
46+
return timestamp;
47+
}
48+
49+
/**
50+
* Gets event tag with number.
51+
*
52+
* @return the event tag with number
53+
*/
54+
public Map<String, Number> getEventTagWithNumber() {
55+
return eventTagWithNumber;
56+
}
57+
58+
/**
59+
* Gets event tag with bool.
60+
*
61+
* @return the event tag with bool
62+
*/
63+
public Map<String, Boolean> getEventTagWithBool() {
64+
return eventTagWithBool;
65+
}
66+
67+
/**
68+
* Gets event tag with str.
69+
*
70+
* @return the event tag with str
71+
*/
72+
public Map<String, String> getEventTagWithStr() {
73+
return eventTagWithStr;
74+
}
75+
76+
/**
77+
* The type Span event data builder.
78+
*/
79+
public static class SpanEventDataBuilder {
80+
private final Map<String, String> eventTagWithStr = new ConcurrentHashMap<>();
81+
private final Map<String, Number> eventTagWithNumber = new ConcurrentHashMap<>();
82+
private final Map<String, Boolean> eventTagWithBool = new ConcurrentHashMap<>();
83+
84+
private SpanEventDataBuilder() {
85+
86+
}
87+
88+
/**
89+
* Build span event data.
90+
*
91+
* @return the span event data
92+
*/
93+
public SpanEventData build() {
94+
SpanEventData spanEventData = new SpanEventData();
95+
spanEventData.eventTagWithStr.putAll(eventTagWithStr);
96+
spanEventData.eventTagWithNumber.putAll(eventTagWithNumber);
97+
spanEventData.eventTagWithBool.putAll(eventTagWithBool);
98+
spanEventData.timestamp = System.currentTimeMillis();
99+
return spanEventData;
100+
}
101+
102+
/**
103+
* Sets event tag.
104+
*
105+
* @param key the key
106+
* @param value the value
107+
* @return the event tag
108+
*/
109+
public SpanEventDataBuilder setEventTag(String key, String value) {
110+
if (StringUtils.isBlank(key) || StringUtils.isBlank(value)) {
111+
return this;
112+
}
113+
this.eventTagWithStr.put(key, value);
114+
return this;
115+
}
116+
117+
/**
118+
* Sets event tag.
119+
*
120+
* @param key the key
121+
* @param value the value
122+
* @return the event tag
123+
*/
124+
public SpanEventDataBuilder setEventTag(String key, boolean value) {
125+
if (StringUtils.isBlank(key)) {
126+
return this;
127+
}
128+
this.eventTagWithBool.put(key, value);
129+
return this;
130+
}
131+
132+
/**
133+
* Sets event tag.
134+
*
135+
* @param key the key
136+
* @param number the number
137+
* @return the event tag
138+
*/
139+
public SpanEventDataBuilder setEventTag(String key, Number number) {
140+
if (StringUtils.isBlank(key) || number == null) {
141+
return this;
142+
}
143+
this.eventTagWithNumber.put(key, number);
144+
return this;
145+
}
146+
}
147+
}

0 commit comments

Comments
 (0)