use apollo_configuration::configuration;
use apollo_configuration::types::Url;
use apollo_redaction::Redacted;
use super::otlp::{Compression, TlsConfig};
#[configuration]
pub(crate) struct GrafanaCloudHttpExporterConfig {
#[config(required)]
pub(crate) instance_id: String,
#[config(required)]
pub(crate) api_key: Redacted<String>,
#[config(required)]
pub(crate) endpoint: Url,
pub(crate) compression: Compression,
#[config(default = 10000)]
pub(crate) timeout: u64,
pub(crate) tls: Option<TlsConfig>,
}
impl GrafanaCloudHttpExporterConfig {
pub(crate) fn auth_header(&self) -> String {
use base64::Engine;
let credentials = format!("{}:{}", self.instance_id, self.api_key.unredact());
format!(
"Basic {}",
base64::engine::general_purpose::STANDARD.encode(credentials)
)
}
}
#[cfg(test)]
mod tests {
use apollo_configuration::parse_yaml;
use super::*;
use crate::config::OpenTelemetryConfig;
use crate::config::SpanExporter;
use crate::config::traces::SpanProcessor;
fn get_grafana_config(config: &OpenTelemetryConfig) -> &GrafanaCloudHttpExporterConfig {
match &config.tracer_provider.processors[0] {
SpanProcessor::Batch(batch) => match &batch.exporter {
SpanExporter::GrafanaCloud(gc) => gc,
_ => panic!("Expected GrafanaCloud exporter"),
},
_ => panic!("Expected Batch processor"),
}
}
#[test]
fn parse_grafana_cloud_exporter() {
let config: OpenTelemetryConfig = parse_yaml(
indoc::indoc! {"
tracer_provider:
processors:
- batch:
exporter:
grafana_cloud:
instance_id: '123456'
api_key: glc_test_key
endpoint: https://otlp-gateway-prod-us-central-0.grafana.net/otlp
"},
&Default::default(),
)
.unwrap();
let gc = get_grafana_config(&config);
assert_eq!(
gc.endpoint.as_str(),
"https://otlp-gateway-prod-us-central-0.grafana.net/otlp"
);
}
#[test]
fn auth_header_basic_encoding() {
let config: OpenTelemetryConfig = parse_yaml(
indoc::indoc! {"
tracer_provider:
processors:
- batch:
exporter:
grafana_cloud:
instance_id: '123456'
api_key: glc_test_key
endpoint: https://otlp-gateway-prod-us-central-0.grafana.net/otlp
"},
&Default::default(),
)
.unwrap();
let gc = get_grafana_config(&config);
let auth = gc.auth_header();
assert!(auth.starts_with("Basic "));
use base64::Engine;
let encoded = auth.strip_prefix("Basic ").unwrap();
let decoded = base64::engine::general_purpose::STANDARD
.decode(encoded)
.unwrap();
let credentials = String::from_utf8(decoded).unwrap();
assert_eq!(credentials, "123456:glc_test_key");
}
}