21 releases
0.8.1 | Jul 3, 2024 |
---|---|
0.7.2 | Apr 21, 2024 |
0.6.1 | Jul 20, 2023 |
0.5.1 | Mar 9, 2023 |
0.4.0 | Oct 28, 2021 |
#141 in Debugging
246 downloads per month
13KB
155 lines
tracing-layer-slack
tracing-layer-slack
provides a Layer
implementation for sending tracing
events to Slack.
Synopsis
SlackLayer
sends POST requests via tokio
and reqwest
to a Slack Webhook URL for each new tracing event. The format of the text
field is statically defined.
This layer also looks for an optional JsonStorageLayer
extension
on the parent span
of each event. This extension may contain additional contextual information for the parent span of an event, which is included into the Slack message.
Installation
Configure the dependencies and pull directly from GitHub:
[dependencies]
tokio = "1.0"
tracing = "0.1"
tracing-layer-slack = "0.6"
Examples
See the full list of examples in examples/.
Simple
In this simple example, a layer is created using Slack configuration in the environment. An orphaned event (one with no parent span) and an event occurring within a span are created in three separate futures, and a number of messages are sent quickly to Slack.
Slack Messages
This screenshots shows the first three Slack messages sent while running this example. More messages are sent but were truncated from these images.
Slack Blocks
By default, messages are sent using Slack Blocks. Here's an example:
Slack Text
By disabling the default features of this crate (and therefore disabling the blocks
feature), you can revert to the older format which does not use the block kit.
Code example
Run this example locally using the following commands:
$ git clone https://github.com/seanpianka/tracing-layer-slack.git
$ cd tracing-layer-slack
$ cargo run --example simple
You must have Slack configuration exported in the environment.
Source
use regex::Regex;
use tracing::{info, warn, instrument};
use tracing_subscriber::{layer::SubscriberExt, Registry};
use tracing_layer_slack::{EventFilters, SlackLayer};
#[instrument]
pub async fn create_user(id: u64) -> u64 {
network_io(id).await;
info!(param = id, "A user was created");
id
}
#[instrument]
pub async fn network_io(id: u64) {
warn!(user_id = id, "some network io happened");
}
pub async fn controller() {
info!("Orphan event without a parent span");
let (id1, id2, id3) = tokio::join!(create_user(2), create_user(4), create_user(6));
}
#[tokio::main]
async fn main() {
// Only show events from where this example code is the target.
let target_to_filter: EventFilters = Regex::new("simple").unwrap().into();
// Initialize the layer and an async background task for sending our Slack messages.
let (slack_layer, background_worker) = SlackLayer::builder("my-app-name".to_string(), target_to_filter).build();
// Initialize the global default subscriber for tracing events.
let subscriber = Registry::default().with(slack_layer);
tracing::subscriber::set_global_default(subscriber).unwrap();
// It must be explicitly started before any messages will be handled.
background_worker.start().await;
// Perform our application code that needs tracing and Slack messages.
controller().await;
// Waits for all Slack messages to be sent before exiting.
background_worker.shutdown().await;
}
Dependencies
~11–28MB
~450K SLoC