-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy pathcontext_api.h
More file actions
131 lines (118 loc) · 4.07 KB
/
context_api.h
File metadata and controls
131 lines (118 loc) · 4.07 KB
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*
* Copyright 2026, Datadog, Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef _CONTEXT_API_H
#define _CONTEXT_API_H
#include "arch.h"
#include "arguments.h"
/**
* Unified context API for trace/span context storage.
*
* This class provides a mode-agnostic interface for reading and writing
* thread context. The actual storage is selected at initialization time
* based on the Arguments::_context_storage setting:
*
* - CTX_STORAGE_PROFILER: Uses existing TLS-based storage (context_tls_v1)
* - CTX_STORAGE_OTEL: Uses OTEL ring buffer storage (discoverable by external profilers)
*
* The abstraction allows signal handlers and JNI code to remain unchanged
* while the underlying storage mechanism can be switched via configuration.
*/
class ContextApi {
public:
/**
* Initialize context storage based on configuration.
*
* Must be called once during profiler startup.
* For OTEL mode, creates the discoverable ring buffer.
*
* @param args Profiler arguments containing _context_storage mode
* @return true if initialization succeeded
*/
static bool initialize(const Arguments& args);
/**
* Shutdown context storage.
*
* Releases resources allocated during initialization.
* For OTEL mode, unmaps the ring buffer.
*/
static void shutdown();
/**
* Check if context storage is initialized.
*
* @return true if initialized
*/
static bool isInitialized();
/**
* Get the current storage mode.
*
* @return The active context storage mode
*/
static ContextStorageMode getMode();
/**
* Write context for the current thread.
*
* This is the primary method for setting trace context from the tracer.
* Maps Datadog's (spanId, rootSpanId) to OTEL's (trace_id_high, trace_id_low, span_id).
*
* In OTEL mode: trace_id_high=0, trace_id_low=rootSpanId, span_id=spanId
*
* @param span_id The span ID
* @param root_span_id The root span ID (trace ID low bits for OTEL)
*/
static void set(u64 span_id, u64 root_span_id);
/**
* Write full OTEL context for the current thread.
*
* Supports full 128-bit trace IDs when in OTEL mode.
* In profiler mode, trace_id_high is ignored.
*
* @param trace_id_high Upper 64 bits of 128-bit trace ID (OTEL only)
* @param trace_id_low Lower 64 bits of 128-bit trace ID (rootSpanId)
* @param span_id The span ID
*/
static void setOtel(u64 trace_id_high, u64 trace_id_low, u64 span_id);
/**
* Read context for the current thread.
*
* Used by signal handlers to get the current trace context.
* Returns false if the context is invalid (torn read or uninitialized).
*
* @param span_id Output: the span ID
* @param root_span_id Output: the root span ID
* @return true if context was successfully read
*/
static bool get(u64& span_id, u64& root_span_id);
/**
* Read context for a specific thread by TID.
*
* Used by JVMTI wall-clock sampling where the sampling thread
* needs to read another thread's context.
*
* @param tid Thread ID to read context for
* @param span_id Output: the span ID
* @param root_span_id Output: the root span ID
* @return true if context was successfully read
*/
static bool getByTid(int tid, u64& span_id, u64& root_span_id);
/**
* Clear context for the current thread.
*/
static void clear();
private:
static ContextStorageMode _mode;
static bool _initialized;
};
#endif /* _CONTEXT_API_H */