-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathmain.go
85 lines (75 loc) · 2.62 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package main
import (
"context"
"flag"
"fmt"
"log"
"net/http"
"os"
"strconv"
"go.opentelemetry.io/otel"
"gopkg.in/DataDog/dd-trace-go.v1/ddtrace"
"gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
otel_trace "go.opentelemetry.io/otel/trace"
ddotel "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/opentelemetry"
)
type apmClientServer struct {
spans map[uint64]tracer.Span
spanContexts map[uint64]ddtrace.SpanContext
otelSpans map[uint64]spanContext
tp *ddotel.TracerProvider
tracer otel_trace.Tracer
}
type spanContext struct {
span otel_trace.Span
ctx context.Context
}
func newServer() *apmClientServer {
s := &apmClientServer{
spans: make(map[uint64]tracer.Span),
spanContexts: make(map[uint64]ddtrace.SpanContext),
otelSpans: make(map[uint64]spanContext),
}
s.tp = ddotel.NewTracerProvider()
otel.SetTracerProvider(s.tp)
return s
}
func main() {
flag.Parse()
defer func() {
if err := recover(); err != nil {
log.Print("encountered unexpected panic", err)
}
}()
port, err := strconv.Atoi(os.Getenv("APM_TEST_CLIENT_SERVER_PORT"))
if err != nil {
log.Fatalf("failed to convert port to integer: %v", err)
}
s := newServer()
// dd-trace endpoints
http.HandleFunc("/trace/span/start", s.startSpanHandler)
http.HandleFunc("/trace/span/flush", s.flushSpansHandler)
http.HandleFunc("/trace/stats/flush", s.flushStatsHandler)
http.HandleFunc("/trace/span/set_meta", s.spanSetMetaHandler)
http.HandleFunc("/trace/span/finish", s.finishSpanHandler)
http.HandleFunc("/trace/span/set_metric", s.spanSetMetricHandler)
http.HandleFunc("/trace/span/inject_headers", s.injectHeadersHandler)
http.HandleFunc("/trace/span/extract_headers", s.extractHeadersHandler)
http.HandleFunc("/trace/span/error", s.spanSetErrorHandler)
http.HandleFunc("/trace/config", s.getTraceConfigHandler)
// otel-api endpoints:
http.HandleFunc("/trace/otel/start_span", s.otelStartSpanHandler)
http.HandleFunc("/trace/otel/end_span", s.otelEndSpanHandler)
http.HandleFunc("/trace/otel/set_attributes", s.otelSetAttributesHandler)
http.HandleFunc("/trace/otel/set_name", s.otelSetNameHandler)
http.HandleFunc("/trace/otel/flush", s.otelFlushSpansHandler)
http.HandleFunc("/trace/otel/is_recording", s.otelIsRecordingHandler)
http.HandleFunc("/trace/otel/span_context", s.otelSpanContextHandler)
http.HandleFunc("/trace/otel/add_event", s.otelAddEventHandler)
http.HandleFunc("/trace/otel/set_status", s.otelSetStatusHandler)
err = http.ListenAndServe(fmt.Sprintf(":%d", port), nil)
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
log.Printf("server listening at %v", fmt.Sprintf("0.0.0.0:%d", port))
}