Crate tracing_layer_slack[][src]

Expand description

tracing-layer-slack

Docs Crates.io

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-futures = "0.2"
tracing-layer-slack = "0.3"

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 this image.

Screenshot demonstrating the current formatter implementation for events sent as Slack messages

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) {
    network_io(id).await;
    info!(param = id, "A user was created");
}

#[instrument]
pub async fn network_io(id: u64) {
    warn!(user_id = id, "had to retry the request once");
}

pub async fn controller() {
    info!("Orphan event without a parent span");
    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(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();

    // 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;
}

Structs

EventFilters describes two optional lists of regular expressions used to filter events.

This worker manages a background async task that schedules the network requests to send traces to the Slack on the running tokio runtime.

Configuration describing how to forward tracing events to Slack.

Layer for forwarding tracing events to Slack.

A builder for creating a Slack layer.