Skip to content

Instantly share code, notes, and snippets.

@brandonros
Created November 18, 2022 20:11
Show Gist options
  • Save brandonros/bcbe946dd84cd5f0c55f8fd01b7e5466 to your computer and use it in GitHub Desktop.
Save brandonros/bcbe946dd84cd5f0c55f8fd01b7e5466 to your computer and use it in GitHub Desktop.

docker-compose.yaml

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

.env

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"] }

rust initialization

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();
}

rust usage example

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();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment