version : " 3.7"
volumes :
postgres :
services :
rust-service : # in the same network by default in docker-compose?
...
datadog-agent :
image : gcr.io/datadoghq/agent:7
environment :
DD_API_KEY : ${DD_API_KEY}
DD_SITE : ${DD_SITE}
DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_HTTP_ENDPOINT : " 0.0.0.0:4318"
DD_APM_NON_LOCAL_TRAFFIC : " true"
DD_APM_ENABLED : " true"
ports :
- " 127.0.0.1:8126:8126"
- " 127.0.0.1:4318:4318"
volumes :
- /var/run/docker.sock:/var/run/docker.sock
- /proc/:/host/proc/:ro
- /sys/fs/cgroup:/host/sys/fs/cgroup:ro
DD_API_KEY=...
DD_SITE=...
DD_AGENT_ENDPOINT=http://datadog-agent:8126 # docker-compose network host name
OTEL_EXPORTER_OTLP_ENDPOINT=http://datadog-agent:4318 # docker-compose network host name
rust dependencies (Cargo.toml)
opentelemetry = { version = " *" , features = [" rt-tokio" ] }
opentelemetry-datadog = { version = " *" , features = [" reqwest-client" ] }
use opentelemetry:: sdk:: { trace:: { self , RandomIdGenerator , Sampler } } ;
use opentelemetry_datadog:: { ApiVersion } ;
pub fn init_tracer ( ) {
let app_name = "options-scraper" ;
let dd_agent_endpoint = std:: env:: var ( "DD_AGENT_ENDPOINT" ) . unwrap ( ) ;
opentelemetry_datadog:: new_pipeline ( )
. with_service_name ( app_name)
. with_version ( ApiVersion :: Version05 )
. with_agent_endpoint ( dd_agent_endpoint)
. with_trace_config (
trace:: config ( )
. with_sampler ( Sampler :: AlwaysOn )
. with_id_generator ( RandomIdGenerator :: default ( ) )
)
. install_batch ( opentelemetry:: runtime:: Tokio )
. unwrap ( ) ;
}
pub fn cleanup ( ) {
opentelemetry:: global:: shutdown_tracer_provider ( ) ;
}
let tracer = opentelemetry:: global:: tracer ( "tracer" ) ;
let mut login_span = tracer. start ( "foobar/login" ) ;
login_span. set_attribute ( KeyValue :: new ( "function" , "get_symbol_series_name_snapshots" ) ) ;
login_span. set_attribute ( KeyValue :: new ( "symbol" , symbol. clone ( ) ) ) ;
login_span. set_attribute ( KeyValue :: new ( "series_name" , series_name. clone ( ) ) ) ;
login_span. set_attribute ( KeyValue :: new ( "expiration_date" , expiration_date. clone ( ) ) ) ;
let login_response = tos. login ( token. clone ( ) ) . await ;
if login_response. is_none ( ) {
login_span. set_status ( Status :: Error { description : std:: borrow:: Cow :: Borrowed ( "login failed" ) } ) ;
login_span. end ( ) ;
tracing:: cleanup ( ) ;
panic ! ( "login failed" ) ;
}
let _login_response = login_response. unwrap ( ) ;
login_span. set_status ( Status :: Ok ) ;
login_span. end ( ) ;