Skip to content
This repository was archived by the owner on May 23, 2023. It is now read-only.

Commit 423096a

Browse files
authored
Merge pull request #47 from opentracing/bhs/log_kv
Key-value logging
2 parents 417c049 + 7c432f8 commit 423096a

File tree

6 files changed

+201
-109
lines changed

6 files changed

+201
-109
lines changed

opentracing-api/src/main/java/io/opentracing/Span.java

Lines changed: 77 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
*/
1414
package io.opentracing;
1515

16+
import java.util.Map;
17+
1618
/**
1719
* Represents an in-flight span in the opentracing system.
1820
*
@@ -65,25 +67,72 @@ public interface Span extends AutoCloseable {
6567
Span setTag(String key, Number value);
6668

6769
/**
68-
* Add a new log event to the Span, accepting an event name string and an optional structured payload argument.
70+
* Log key:value pairs to the Span with the current walltime timestamp.
71+
*
72+
* <p><strong>CAUTIONARY NOTE:</strong> not all Tracer implementations support key:value log fields end-to-end.
73+
* Caveat emptor.
74+
*
75+
* <p>A contrived example (using Guava, which is not required):
76+
* <pre>{@code
77+
span.log(
78+
ImmutableMap.Builder<String, Object>()
79+
.put("event", "soft error")
80+
.put("type", "cache timeout")
81+
.put("waited.millis", 1500)
82+
.build());
83+
}</pre>
84+
*
85+
* @param fields key:value log fields. Tracer implementations should support String, numeric, and boolean values;
86+
* some may also support arbitrary Objects.
87+
* @return the Span, for chaining
88+
* @see Span#log(String)
89+
*/
90+
Span log(Map<String, ?> fields);
91+
92+
/**
93+
* Like log(Map&lt;String, Object&gt;), but with an explicit timestamp.
6994
*
70-
* If specified, the payload argument may be of any type and arbitrary size, though implementations are not
71-
* required to retain all payload arguments (or even all parts of all payload arguments).
95+
* <p><strong>CAUTIONARY NOTE:</strong> not all Tracer implementations support key:value log fields end-to-end.
96+
* Caveat emptor.
7297
*
73-
* The timestamp of this log event is the current time.
74-
**/
75-
Span log(String eventName, /* @Nullable */ Object payload);
98+
* @param timestampMicroseconds The explicit timestamp for the log record. Must be greater than or equal to the
99+
* Span's start timestamp.
100+
* @param fields key:value log fields. Tracer implementations should support String, numeric, and boolean values;
101+
* some may also support arbitrary Objects.
102+
* @return the Span, for chaining
103+
* @see Span#log(long, String)
104+
*/
105+
Span log(long timestampMicroseconds, Map<String, ?> fields);
76106

77107
/**
78-
* Add a new log event to the Span, accepting an event name string and an optional structured payload argument.
108+
* Record an event at the current walltime timestamp.
79109
*
80-
* If specified, the payload argument may be of any type and arbitrary size, though implementations are not
81-
* required to retain all payload arguments (or even all parts of all payload arguments).
110+
* Shorthand for
82111
*
83-
* The timestamp is specified manually here to represent a past log event.
84-
* The timestamp in microseconds in UTC time.
85-
**/
86-
Span log(long timestampMicroseconds, String eventName, /* @Nullable */ Object payload);
112+
* <pre>{@code
113+
span.log(Collections.singletonMap("event", event));
114+
}</pre>
115+
*
116+
* @param event the event value; often a stable identifier for a moment in the Span lifecycle
117+
* @return the Span, for chaining
118+
*/
119+
Span log(String event);
120+
121+
/**
122+
* Record an event at a specific timestamp.
123+
*
124+
* Shorthand for
125+
*
126+
* <pre>{@code
127+
span.log(timestampMicroseconds, Collections.singletonMap("event", event));
128+
}</pre>
129+
*
130+
* @param timestampMicroseconds The explicit timestamp for the log record. Must be greater than or equal to the
131+
* Span's start timestamp.
132+
* @param event the event value; often a stable identifier for a moment in the Span lifecycle
133+
* @return the Span, for chaining
134+
*/
135+
Span log(long timestampMicroseconds, String event);
87136

88137
/**
89138
* Sets a baggage item in the Span (and its SpanContext) as a key/value pair.
@@ -111,4 +160,19 @@ public interface Span extends AutoCloseable {
111160
* @return this Span instance, for chaining
112161
*/
113162
Span setOperationName(String operationName);
163+
164+
/**
165+
* @deprecated use {@link #log(Map)} like this
166+
* {@code span.log(Map.of("event", "timeout"))}
167+
* or
168+
* {@code span.log(timestampMicroseconds, Map.of("event", "exception", "payload", stackTrace))}
169+
**/
170+
Span log(String eventName, /* @Nullable */ Object payload);
171+
/**
172+
* @deprecated use {@link #log(Map)} like this
173+
* {@code span.log(timestampMicroseconds, Map.of("event", "timeout"))}
174+
* or
175+
* {@code span.log(timestampMicroseconds, Map.of("event", "exception", "payload", stackTrace))}
176+
**/
177+
Span log(long timestampMicroseconds, String eventName, /* @Nullable */ Object payload);
114178
}

opentracing-api/src/test/java/io/opentracing/PlaygroundTest.java

Lines changed: 0 additions & 37 deletions
This file was deleted.

opentracing-impl-java8/src/main/java/io/opentracing/AbstractSpan.java

Lines changed: 41 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,7 @@
1515

1616
import java.time.Duration;
1717
import java.time.Instant;
18-
import java.util.ArrayList;
19-
import java.util.Collections;
20-
import java.util.HashMap;
21-
import java.util.List;
22-
import java.util.Map;
18+
import java.util.*;
2319
import java.util.concurrent.TimeUnit;
2420

2521
abstract class AbstractSpan implements Span, SpanContext {
@@ -127,18 +123,46 @@ public final Map<String,String> getBaggage() {
127123
}
128124

129125
@Override
130-
public final Span log(String message, /* @Nullable */ Object payload) {
126+
public final Span log(String event) {
127+
return log(nowMicros(), event);
128+
}
129+
130+
@Override
131+
public final Span log(long timestampMicros, String event) {
132+
return log(timestampMicros, Collections.singletonMap("event", event));
133+
}
134+
135+
@Override
136+
public final Span log(Map<String, ?> fields) {
137+
return log(nowMicros(), fields);
138+
}
139+
140+
@Override
141+
public final Span log(long timestampMicros, Map<String, ?> fields) {
142+
Instant timestamp = Instant.ofEpochSecond(timestampMicros / 1000000, (timestampMicros % 1000000) * 1000);
143+
logs.add(new LogData(timestamp, fields));
144+
return this;
145+
}
146+
147+
@Override
148+
public final Span log(String event, /* @Nullable */ Object payload) {
131149
Instant now = Instant.now();
132150

133151
return log(
134152
TimeUnit.SECONDS.toMicros(now.getEpochSecond()) + TimeUnit.NANOSECONDS.toMicros(now.getNano()),
135-
message,
153+
event,
136154
payload);
137155
}
138156

139157
@Override
140-
public final Span log(long instantMicroseconds, String message, /* @Nullable */ Object payload) {
141-
logs.add(new LogData(start, message, payload));
158+
public final Span log(long timestampMicros, String event, /* @Nullable */ Object payload) {
159+
Instant timestamp = Instant.ofEpochSecond(timestampMicros / 1000000, (timestampMicros % 1000000) * 1000);
160+
Map<String, Object> fields = new HashMap<>();
161+
fields.put("event", event);
162+
if (payload != null) {
163+
fields.put("payload", payload);
164+
}
165+
logs.add(new LogData(timestamp, fields));
142166
return this;
143167
}
144168

@@ -148,13 +172,16 @@ public final List<LogData> getLogs() {
148172

149173
final class LogData {
150174
private final Instant time;
151-
private final String message;
152-
private final Object payload;
175+
private final Map<String, ?> fields;
153176

154-
LogData(Instant time, String message, Object payload) {
177+
LogData(Instant time, Map<String, ?> fields) {
155178
this.time = time;
156-
this.message = message;
157-
this.payload = payload;
179+
this.fields = fields;
158180
}
159181
}
182+
183+
static long nowMicros() {
184+
Instant now = Instant.now();
185+
return (now.getEpochSecond() * 1000000) + (now.getNano() / 1000);
186+
}
160187
}

opentracing-impl/src/main/java/io/opentracing/NoopSpan.java

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -39,34 +39,34 @@ public void finish() {}
3939
public void finish(long finishMicros) {}
4040

4141
@Override
42-
public void close() {
43-
finish();
44-
}
42+
public void close() { finish(); }
4543

4644
@Override
47-
public Span setTag(String key, String value) {
48-
return this;
49-
}
45+
public Span setTag(String key, String value) { return this; }
5046

5147
@Override
52-
public Span setTag(String key, boolean value) {
53-
return this;
54-
}
48+
public Span setTag(String key, boolean value) { return this; }
5549

5650
@Override
57-
public Span setTag(String key, Number value) {
58-
return this;
59-
}
51+
public Span setTag(String key, Number value) { return this; }
6052

6153
@Override
62-
public Span log(String eventName, Object payload) {
63-
return this;
64-
}
54+
public Span log(Map<String, ?> fields) { return this; }
6555

6656
@Override
67-
public Span log(long timestampMicroseconds, String eventName, Object payload) {
68-
return this;
69-
}
57+
public Span log(long timestampMicroseconds, Map<String, ?> fields) { return this; }
58+
59+
@Override
60+
public Span log(String event) { return this; }
61+
62+
@Override
63+
public Span log(long timestampMicroseconds, String event) { return this; }
64+
65+
@Override
66+
public Span log(String eventName, Object payload) { return this; }
67+
68+
@Override
69+
public Span log(long timestampMicroseconds, String eventName, Object payload) { return this; }
7070

7171
@Override
7272
public Span setBaggageItem(String key, String value) { return this; }
@@ -75,8 +75,6 @@ public Span log(long timestampMicroseconds, String eventName, Object payload) {
7575
public String getBaggageItem(String key) { return null; }
7676

7777
@Override
78-
public Span setOperationName(String operationName) {
79-
return this;
80-
}
78+
public Span setOperationName(String operationName) { return this; }
8179

8280
}

0 commit comments

Comments
 (0)