Skip to content

Commit a0b146d

Browse files
Merge pull request #799 from saschagrunert/telemetry-link
Propagate existing telemetry spans to server
2 parents bc507cc + 6cfba5a commit a0b146d

File tree

11 files changed

+421
-169
lines changed

11 files changed

+421
-169
lines changed

.golangci.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ linters:
9595
# - wsl
9696
linters-settings:
9797
funlen:
98-
lines: 90
98+
lines: 100
9999
statements: 50
100100
varnamelen:
101101
min-name-length: 1

Cargo.lock

+18
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

conmon-rs/common/proto/conmon.capnp

+7
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ interface Conmon {
55
# Version
66
struct VersionRequest {
77
verbose @0 :Bool;
8+
metadata @1 :Data;
89
}
910

1011
struct VersionResponse {
@@ -17,6 +18,7 @@ interface Conmon {
1718
rustVersion @6 :Text;
1819
cargoVersion @7 :Text;
1920
cargoTree @8 :Text;
21+
metadata @9 :Data;
2022
}
2123

2224
version @0 (request: VersionRequest) -> (response: VersionResponse);
@@ -34,6 +36,7 @@ interface Conmon {
3436
cleanupCmd @7 :List(Text);
3537
globalArgs @8 :List(Text);
3638
commandArgs @9 :List(Text);
39+
metadata @10 :Data;
3740
}
3841

3942
struct LogDriver {
@@ -65,6 +68,7 @@ interface Conmon {
6568
timeoutSec @1 :UInt64;
6669
command @2 :List(Text);
6770
terminal @3 :Bool;
71+
metadata @4 :Data;
6872
}
6973

7074
struct ExecSyncContainerResponse {
@@ -83,6 +87,7 @@ interface Conmon {
8387
socketPath @1 :Text;
8488
execSessionId @2 :Text;
8589
stopAfterStdinEof @3 :Bool;
90+
metadata @4 :Data;
8691
}
8792

8893
struct AttachResponse {
@@ -94,6 +99,7 @@ interface Conmon {
9499
# ReopenLog
95100
struct ReopenLogRequest {
96101
id @0 :Text;
102+
metadata @1 :Data;
97103
}
98104

99105
struct ReopenLogResponse {
@@ -107,6 +113,7 @@ interface Conmon {
107113
id @0 :Text; # container identifier
108114
width @1 :UInt16; # columns in characters
109115
height @2 :UInt16; # rows in characters
116+
metadata @3 :Data;
110117
}
111118

112119
struct SetWindowSizeResponse {

conmon-rs/server/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ prctl = "1.0.0"
2929
regex = "1.6.0"
3030
sendfd = { version = "0.4.3", features = ["tokio"] }
3131
serde = { version = "1.0.145", features = ["derive"] }
32+
serde_json = "1.0.86"
3233
shadow-rs = "=0.16.1"
3334
strum = { version = "0.24.1", features = ["derive"] }
3435
tempfile = "3.3.0"

conmon-rs/server/src/rpc.rs

+13-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use crate::{
33
container_io::{ContainerIO, SharedContainerIO},
44
container_log::ContainerLog,
55
server::Server,
6+
telemetry::Telemetry,
67
version::Version,
78
};
89
use anyhow::format_err;
@@ -68,8 +69,9 @@ impl conmon::Server for Server {
6869
debug!("Got a version request");
6970

7071
let req = pry!(pry!(params.get()).get_request());
71-
let version = Version::new(req.get_verbose());
72+
pry_err!(Telemetry::set_parent_context(pry!(req.get_metadata())));
7273

74+
let version = Version::new(req.get_verbose());
7375
let mut response = results.get().init_response();
7476
response.set_process_id(process::id());
7577
response.set_version(version.version());
@@ -91,6 +93,8 @@ impl conmon::Server for Server {
9193
mut results: conmon::CreateContainerResults,
9294
) -> Promise<(), capnp::Error> {
9395
let req = pry!(pry!(params.get()).get_request());
96+
pry_err!(Telemetry::set_parent_context(pry!(req.get_metadata())));
97+
9498
let id = pry!(req.get_id()).to_string();
9599
let cleanup_cmd: Vec<String> = pry!(pry!(req.get_cleanup_cmd())
96100
.iter()
@@ -180,6 +184,8 @@ impl conmon::Server for Server {
180184
mut results: conmon::ExecSyncContainerResults,
181185
) -> Promise<(), capnp::Error> {
182186
let req = pry!(pry!(params.get()).get_request());
187+
pry_err!(Telemetry::set_parent_context(pry!(req.get_metadata())));
188+
183189
let id = pry!(req.get_id()).to_string();
184190
let timeout = req.get_timeout_sec();
185191

@@ -262,6 +268,8 @@ impl conmon::Server for Server {
262268
_: conmon::AttachContainerResults,
263269
) -> Promise<(), capnp::Error> {
264270
let req = pry!(pry!(params.get()).get_request());
271+
pry_err!(Telemetry::set_parent_context(pry!(req.get_metadata())));
272+
265273
let container_id = pry_err!(req.get_id());
266274

267275
let span = new_root_span!("attach_container", container_id);
@@ -300,6 +308,8 @@ impl conmon::Server for Server {
300308
_: conmon::ReopenLogContainerResults,
301309
) -> Promise<(), capnp::Error> {
302310
let req = pry!(pry!(params.get()).get_request());
311+
pry_err!(Telemetry::set_parent_context(pry!(req.get_metadata())));
312+
303313
let container_id = pry_err!(req.get_id());
304314

305315
let span = new_root_span!("reopen_log_container", container_id);
@@ -322,6 +332,8 @@ impl conmon::Server for Server {
322332
_: conmon::SetWindowSizeContainerResults,
323333
) -> Promise<(), capnp::Error> {
324334
let req = pry!(pry!(params.get()).get_request());
335+
pry_err!(Telemetry::set_parent_context(pry!(req.get_metadata())));
336+
325337
let container_id = pry_err!(req.get_id());
326338

327339
let span = new_root_span!("set_window_size_container", container_id);

conmon-rs/server/src/telemetry.rs

+32-3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use clap::crate_name;
44
use nix::unistd::gethostname;
55
use opentelemetry::{
66
global,
7+
propagation::Extractor,
78
runtime::Tokio,
89
sdk::{
910
propagation::TraceContextPropagator,
@@ -13,9 +14,9 @@ use opentelemetry::{
1314
};
1415
use opentelemetry_otlp::{ExportConfig, WithExportConfig};
1516
use opentelemetry_semantic_conventions::resource::{HOST_NAME, PROCESS_PID, SERVICE_NAME};
16-
use std::process;
17-
use tracing::Subscriber;
18-
use tracing_opentelemetry::OpenTelemetryLayer;
17+
use std::{collections::HashMap, process};
18+
use tracing::{Span, Subscriber};
19+
use tracing_opentelemetry::{OpenTelemetryLayer, OpenTelemetrySpanExt};
1920
use tracing_subscriber::registry::LookupSpan;
2021

2122
/// The main structure of this module.
@@ -60,4 +61,32 @@ impl Telemetry {
6061
pub fn shutdown() {
6162
global::shutdown_tracer_provider();
6263
}
64+
65+
/// Set a new parent context from the provided slice data.
66+
pub fn set_parent_context(slice: &'_ [u8]) -> Result<()> {
67+
if slice.is_empty() {
68+
// Make it a noop if no data is provided.
69+
return Ok(());
70+
}
71+
72+
let metadata = Metadata(serde_json::from_slice(slice).context("parse slice as JSON")?);
73+
let ctx = global::get_text_map_propagator(|prop| prop.extract(&metadata));
74+
Span::current().set_parent(ctx);
75+
76+
Ok(())
77+
}
78+
}
79+
80+
/// Additional telemetry metadata to carry.
81+
struct Metadata<'a>(HashMap<&'a str, &'a str>);
82+
83+
impl<'a> Extractor for Metadata<'a> {
84+
fn get(&self, key: &str) -> Option<&str> {
85+
self.0.get(key).copied()
86+
}
87+
88+
/// Collect all the keys from the MetadataMap.
89+
fn keys(&self) -> Vec<&str> {
90+
self.0.keys().copied().collect()
91+
}
6392
}

go.mod

+4
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,17 @@ require (
1212
github.com/opencontainers/runc v1.1.4
1313
github.com/opencontainers/runtime-tools v0.9.1-0.20220714195903-17b3287fafb7
1414
github.com/sirupsen/logrus v1.9.0
15+
go.opentelemetry.io/otel v1.10.0
16+
go.opentelemetry.io/otel/trace v1.10.0
1517
)
1618

1719
require (
1820
github.com/blang/semver v3.5.1+incompatible // indirect
1921
github.com/coreos/go-systemd/v22 v22.4.0 // indirect
2022
github.com/cyphar/filepath-securejoin v0.2.3 // indirect
2123
github.com/docker/go-units v0.5.0 // indirect
24+
github.com/go-logr/logr v1.2.3 // indirect
25+
github.com/go-logr/stdr v1.2.2 // indirect
2226
github.com/godbus/dbus/v5 v5.1.0 // indirect
2327
github.com/google/go-cmp v0.5.9 // indirect
2428
github.com/hashicorp/errwrap v1.1.0 // indirect

go.sum

+9
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,11 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9
288288
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
289289
github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
290290
github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
291+
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
292+
github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
293+
github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
294+
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
295+
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
291296
github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0=
292297
github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
293298
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
@@ -697,6 +702,10 @@ go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
697702
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
698703
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
699704
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
705+
go.opentelemetry.io/otel v1.10.0 h1:Y7DTJMR6zs1xkS/upamJYk0SxxN4C9AqRd77jmZnyY4=
706+
go.opentelemetry.io/otel v1.10.0/go.mod h1:NbvWjCthWHKBEUMpf0/v8ZRZlni86PpGFEMA9pnQSnQ=
707+
go.opentelemetry.io/otel/trace v1.10.0 h1:npQMbR8o7mum8uF95yFbOEJffhs1sbCOfDh8zAJiH5E=
708+
go.opentelemetry.io/otel/trace v1.10.0/go.mod h1:Sij3YYczqAdz+EhmGhE6TpTxUO5/F/AzrK+kxfGqySM=
700709
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
701710
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
702711
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=

0 commit comments

Comments
 (0)