1mod accessor;
4mod lookup;
5mod provider;
6mod registry;
7mod remote_config;
8
9#[cfg(any(test, feature = "test-util"))]
10pub mod test_util;
11
12pub use accessor::Accessor;
13pub use lookup::{lookup_float64, lookup_int64, lookup_string};
14pub use provider::SemanticRegistryProvider;
15pub use registry::{Condition, Provider, Registry, TagInfo, ValueType, EMBEDDED_REGISTRY};
16
17#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
24pub enum Concept {
25 PeerService,
28 PeerHostname,
30 PeerDbName,
32 PeerDbSystem,
34 PeerCassandraContactPoints,
36 PeerCouchbaseSeedNodes,
38 PeerMessagingDestination,
40 PeerMessagingSystem,
42 PeerKafkaBootstrapServers,
44 PeerRpcService,
46 PeerRpcSystem,
48 PeerAwsS3Bucket,
50 PeerAwsSqsQueue,
52 PeerAwsDynamoDbTable,
54 PeerAwsKinesisStream,
56
57 HttpStatusCode,
60 HttpMethod,
62 HttpRoute,
64 UrlTemplate,
66 RpcGrpcStatusCode,
68 SpanKind,
70 DdBaseService,
72
73 ServiceName,
76 ResourceName,
78 OperationName,
80 SpanType,
82 DbSystem,
84 DbStatement,
86 DbNamespace,
88 RpcSystem,
90 RpcService,
92 MessagingSystem,
94 MessagingDestination,
96 DeploymentEnvironment,
98 ServiceVersion,
100 ContainerId,
102 K8sPodUid,
104
105 DbQuery,
108 MongoDbQuery,
110 ElasticsearchBody,
112 OpenSearchBody,
114 RedisRawCommand,
116 ValkeyRawCommand,
118 MemcachedCommand,
120 HttpUrl,
122
123 MessagingOperation,
126 GraphQlOperationType,
128 GraphQlOperationName,
130 FaasInvokedProvider,
132 FaasInvokedName,
134 FaasTrigger,
136 NetworkProtocolName,
138 RpcMethod,
140 Component,
142 LinkName,
144
145 DdMeasured,
148 DdTopLevel,
150 SamplingPriority,
152 OtelTraceId,
154 DdPTid,
156 DdPartialVersion,
158 DdOrigin,
160
161 DdEnv,
164 DdVersion,
166 DdHostname,
168 DdGitCommitSha,
170 DdDecisionMaker,
172 DdApmMode,
174}
175
176impl Concept {
177 pub const ALL: &'static [Concept] = &[
180 Concept::PeerService,
182 Concept::PeerHostname,
183 Concept::PeerDbName,
184 Concept::PeerDbSystem,
185 Concept::PeerCassandraContactPoints,
186 Concept::PeerCouchbaseSeedNodes,
187 Concept::PeerMessagingDestination,
188 Concept::PeerMessagingSystem,
189 Concept::PeerKafkaBootstrapServers,
190 Concept::PeerRpcService,
191 Concept::PeerRpcSystem,
192 Concept::PeerAwsS3Bucket,
193 Concept::PeerAwsSqsQueue,
194 Concept::PeerAwsDynamoDbTable,
195 Concept::PeerAwsKinesisStream,
196 Concept::HttpStatusCode,
198 Concept::HttpMethod,
199 Concept::HttpRoute,
200 Concept::UrlTemplate,
201 Concept::RpcGrpcStatusCode,
202 Concept::SpanKind,
203 Concept::DdBaseService,
204 Concept::ServiceName,
206 Concept::ResourceName,
207 Concept::OperationName,
208 Concept::SpanType,
209 Concept::DbSystem,
210 Concept::DbStatement,
211 Concept::DbNamespace,
212 Concept::RpcSystem,
213 Concept::RpcService,
214 Concept::MessagingSystem,
215 Concept::MessagingDestination,
216 Concept::DeploymentEnvironment,
217 Concept::ServiceVersion,
218 Concept::ContainerId,
219 Concept::K8sPodUid,
220 Concept::DbQuery,
222 Concept::MongoDbQuery,
223 Concept::ElasticsearchBody,
224 Concept::OpenSearchBody,
225 Concept::RedisRawCommand,
226 Concept::ValkeyRawCommand,
227 Concept::MemcachedCommand,
228 Concept::HttpUrl,
229 Concept::MessagingOperation,
231 Concept::GraphQlOperationType,
232 Concept::GraphQlOperationName,
233 Concept::FaasInvokedProvider,
234 Concept::FaasInvokedName,
235 Concept::FaasTrigger,
236 Concept::NetworkProtocolName,
237 Concept::RpcMethod,
238 Concept::Component,
239 Concept::LinkName,
240 Concept::DdMeasured,
242 Concept::DdTopLevel,
243 Concept::SamplingPriority,
244 Concept::OtelTraceId,
245 Concept::DdPTid,
246 Concept::DdPartialVersion,
247 Concept::DdOrigin,
248 Concept::DdEnv,
250 Concept::DdVersion,
251 Concept::DdHostname,
252 Concept::DdGitCommitSha,
253 Concept::DdDecisionMaker,
254 Concept::DdApmMode,
255 ];
256
257 pub const fn as_str(&self) -> &'static str {
259 match self {
260 Concept::PeerService => "peer.service",
262 Concept::PeerHostname => "peer.hostname",
263 Concept::PeerDbName => "peer.db.name",
264 Concept::PeerDbSystem => "peer.db.system",
265 Concept::PeerCassandraContactPoints => "peer.cassandra.contact.points",
266 Concept::PeerCouchbaseSeedNodes => "peer.couchbase.seed.nodes",
267 Concept::PeerMessagingDestination => "peer.messaging.destination",
268 Concept::PeerMessagingSystem => "peer.messaging.system",
269 Concept::PeerKafkaBootstrapServers => "peer.kafka.bootstrap.servers",
270 Concept::PeerRpcService => "peer.rpc.service",
271 Concept::PeerRpcSystem => "peer.rpc.system",
272 Concept::PeerAwsS3Bucket => "peer.aws.s3.bucket",
273 Concept::PeerAwsSqsQueue => "peer.aws.sqs.queue",
274 Concept::PeerAwsDynamoDbTable => "peer.aws.dynamodb.table",
275 Concept::PeerAwsKinesisStream => "peer.aws.kinesis.stream",
276 Concept::HttpStatusCode => "http.status_code",
278 Concept::HttpMethod => "http.method",
279 Concept::HttpRoute => "http.route",
280 Concept::UrlTemplate => "url.template",
281 Concept::RpcGrpcStatusCode => "rpc.grpc.status_code",
282 Concept::SpanKind => "span.kind",
283 Concept::DdBaseService => "_dd.base_service",
284 Concept::ServiceName => "service.name",
286 Concept::ResourceName => "resource.name",
287 Concept::OperationName => "operation.name",
288 Concept::SpanType => "span.type",
289 Concept::DbSystem => "db.system",
290 Concept::DbStatement => "db.statement",
291 Concept::DbNamespace => "db.namespace",
292 Concept::RpcSystem => "rpc.system",
293 Concept::RpcService => "rpc.service",
294 Concept::MessagingSystem => "messaging.system",
295 Concept::MessagingDestination => "messaging.destination",
296 Concept::DeploymentEnvironment => "deployment.environment",
297 Concept::ServiceVersion => "service.version",
298 Concept::ContainerId => "container.id",
299 Concept::K8sPodUid => "k8s.pod.uid",
300 Concept::DbQuery => "db.query",
302 Concept::MongoDbQuery => "mongodb.query",
303 Concept::ElasticsearchBody => "elasticsearch.body",
304 Concept::OpenSearchBody => "opensearch.body",
305 Concept::RedisRawCommand => "redis.raw_command",
306 Concept::ValkeyRawCommand => "valkey.raw_command",
307 Concept::MemcachedCommand => "memcached.command",
308 Concept::HttpUrl => "http.url",
309 Concept::MessagingOperation => "messaging.operation",
311 Concept::GraphQlOperationType => "graphql.operation.type",
312 Concept::GraphQlOperationName => "graphql.operation.name",
313 Concept::FaasInvokedProvider => "faas.invoked.provider",
314 Concept::FaasInvokedName => "faas.invoked.name",
315 Concept::FaasTrigger => "faas.trigger",
316 Concept::NetworkProtocolName => "network.protocol.name",
317 Concept::RpcMethod => "rpc.method",
318 Concept::Component => "component",
319 Concept::LinkName => "link.name",
320 Concept::DdMeasured => "_dd.measured",
322 Concept::DdTopLevel => "_dd.top_level",
323 Concept::SamplingPriority => "_sampling_priority_v1",
324 Concept::OtelTraceId => "otel.trace_id",
325 Concept::DdPTid => "_dd.p.tid",
326 Concept::DdPartialVersion => "_dd.partial_version",
327 Concept::DdOrigin => "_dd.origin",
328 Concept::DdEnv => "env",
330 Concept::DdVersion => "version",
331 Concept::DdHostname => "_dd.hostname",
332 Concept::DdGitCommitSha => "_dd.git.commit.sha",
333 Concept::DdDecisionMaker => "_dd.p.dm",
334 Concept::DdApmMode => "_dd.apm_mode",
335 }
336 }
337
338 fn from_name(s: &str) -> Option<Concept> {
342 Concept::ALL.iter().copied().find(|c| c.as_str() == s)
343 }
344}
345
346#[cfg(test)]
351mod tests {
352 use super::*;
353
354 #[test]
355 fn concept_all_entries_are_unique() {
356 let mut seen = std::collections::HashSet::new();
357 for c in Concept::ALL {
358 assert!(seen.insert(c.as_str()), "duplicate concept string: {}", c.as_str());
359 }
360 }
361
362 #[test]
363 fn concept_from_name_roundtrip() {
364 for c in Concept::ALL {
365 assert_eq!(Concept::from_name(c.as_str()), Some(*c));
366 }
367 assert_eq!(Concept::from_name("nope.not.a.concept"), None);
368 }
369}