Skip to content

Commit 61bb08a

Browse files
committed
metrics/log_encoder: Log metrics in JSON format too
This format can be parsed by Datadog to recreate our Grafana graphs in that system too.
1 parent ea9fbd0 commit 61bb08a

File tree

1 file changed

+25
-1
lines changed

1 file changed

+25
-1
lines changed

src/metrics/log_encoder.rs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use serde::ser::SerializeSeq;
66
use serde::{Serialize, Serializer as _};
77
use serde_json::Serializer;
88
use std::cell::Cell;
9+
use std::collections::HashMap;
910
use std::io::Write;
1011
use std::rc::Rc;
1112

@@ -43,6 +44,22 @@ impl Encoder for LogEncoder {
4344
fn encode<W: Write>(&self, families: &[MetricFamily], dest: &mut W) -> prometheus::Result<()> {
4445
let events = families_to_json_events(families);
4546

47+
let metrics = events
48+
.iter()
49+
.map(|event| {
50+
let value = MapMetric {
51+
data: event.metric.data.clone(),
52+
tags: event.metric.tags.clone(),
53+
};
54+
(event.metric.name, value)
55+
})
56+
.collect::<HashMap<_, _>>();
57+
58+
match serde_json::to_string(&metrics) {
59+
Ok(json) => info!(target: "metrics", "{{\"metrics\":{json}}}"),
60+
Err(error) => warn!(target: "metrics", "Failed to serialize metrics: {error}"),
61+
}
62+
4663
let chunks = serialize_and_split_list(events.iter(), CHUNKS_MAX_SIZE_BYTES)
4764
.map_err(|e| Error::Msg(e.to_string()))?;
4865

@@ -180,6 +197,13 @@ impl Write for TrackedWriter {
180197
}
181198
}
182199

200+
#[derive(Serialize, Debug, PartialEq)]
201+
struct MapMetric<'a> {
202+
#[serde(flatten)]
203+
data: VectorMetricData,
204+
tags: IndexMap<&'a str, &'a str>,
205+
}
206+
183207
#[derive(Serialize, Debug, PartialEq)]
184208
struct VectorEvent<'a> {
185209
metric: VectorMetric<'a>,
@@ -194,7 +218,7 @@ struct VectorMetric<'a> {
194218
tags: IndexMap<&'a str, &'a str>,
195219
}
196220

197-
#[derive(Serialize, Debug, PartialEq)]
221+
#[derive(Serialize, Clone, Debug, PartialEq)]
198222
#[serde(rename_all = "snake_case")]
199223
enum VectorMetricData {
200224
AggregatedHistogram {

0 commit comments

Comments
 (0)