From a73b03f0c1c070473bfac3cdd67233bcb1df218f Mon Sep 17 00:00:00 2001 From: Bruce Guenter Date: Mon, 19 Jun 2023 13:15:20 -0600 Subject: [PATCH 1/4] chore(config): Convert top-level sinks enum to typetag --- docs/tutorials/sinks/1_basic_sink.md | 59 +-- src/components/validation/mod.rs | 6 +- src/components/validation/runner/config.rs | 8 +- src/config/builder.rs | 17 +- src/config/graph.rs | 4 +- src/config/mod.rs | 2 +- src/config/sink.rs | 48 ++- src/config/unit_test/unit_test_components.rs | 6 +- src/sinks/amqp/config.rs | 6 +- src/sinks/appsignal/mod.rs | 3 +- src/sinks/aws_cloudwatch_logs/config.rs | 6 +- src/sinks/aws_cloudwatch_metrics/mod.rs | 6 +- src/sinks/aws_kinesis/firehose/config.rs | 6 +- src/sinks/aws_kinesis/streams/config.rs | 6 +- src/sinks/aws_s3/config.rs | 6 +- src/sinks/aws_sqs/config.rs | 6 +- src/sinks/axiom.rs | 3 +- src/sinks/azure_blob/config.rs | 6 +- src/sinks/azure_monitor_logs.rs | 6 +- src/sinks/blackhole/config.rs | 6 +- src/sinks/clickhouse/config.rs | 3 +- src/sinks/console/config.rs | 6 +- src/sinks/databend/config.rs | 3 +- src/sinks/datadog/events/config.rs | 6 +- src/sinks/datadog/logs/config.rs | 5 +- src/sinks/datadog/logs/integration_tests.rs | 2 +- src/sinks/datadog/logs/mod.rs | 2 - src/sinks/datadog/logs/tests.rs | 4 +- src/sinks/datadog/metrics/config.rs | 3 +- src/sinks/datadog/traces/config.rs | 3 +- src/sinks/datadog_archives.rs | 1 + src/sinks/elasticsearch/config.rs | 3 +- src/sinks/file/mod.rs | 3 +- src/sinks/gcp/chronicle_unstructured.rs | 6 +- src/sinks/gcp/cloud_storage.rs | 6 +- src/sinks/gcp/pubsub.rs | 6 +- src/sinks/gcp/stackdriver_logs.rs | 6 +- src/sinks/gcp/stackdriver_metrics.rs | 6 +- src/sinks/honeycomb.rs | 3 +- src/sinks/http.rs | 3 +- src/sinks/humio/logs.rs | 3 +- src/sinks/humio/metrics.rs | 3 +- src/sinks/influxdb/logs.rs | 3 +- src/sinks/influxdb/metrics.rs | 3 +- src/sinks/kafka/config.rs | 6 +- src/sinks/loki/config.rs | 3 +- src/sinks/mezmo.rs | 6 +- src/sinks/mod.rs | 389 ------------------- src/sinks/nats.rs | 6 +- src/sinks/new_relic/config.rs | 3 +- src/sinks/papertrail.rs | 3 +- src/sinks/prometheus/exporter.rs | 6 +- src/sinks/prometheus/remote_write.rs | 6 +- src/sinks/pulsar/config.rs | 3 +- src/sinks/redis.rs | 3 +- src/sinks/sematext/logs.rs | 3 +- src/sinks/sematext/metrics.rs | 3 +- src/sinks/socket.rs | 3 +- src/sinks/splunk_hec/logs/config.rs | 6 +- src/sinks/splunk_hec/metrics/config.rs | 6 +- src/sinks/statsd/config.rs | 3 +- src/sinks/util/adaptive_concurrency/tests.rs | 3 +- src/sinks/vector/config.rs | 3 +- src/sinks/webhdfs/config.rs | 3 +- src/sinks/websocket/config.rs | 6 +- src/test_util/mock/sinks/backpressure.rs | 3 +- src/test_util/mock/sinks/basic.rs | 3 +- src/test_util/mock/sinks/error.rs | 3 +- src/test_util/mock/sinks/oneshot.rs | 3 +- src/test_util/mock/sinks/panic.rs | 3 +- src/topology/builder.rs | 3 +- src/topology/schema.rs | 2 +- 72 files changed, 263 insertions(+), 538 deletions(-) diff --git a/docs/tutorials/sinks/1_basic_sink.md b/docs/tutorials/sinks/1_basic_sink.md index ca91266925e80..18194636eb469 100644 --- a/docs/tutorials/sinks/1_basic_sink.md +++ b/docs/tutorials/sinks/1_basic_sink.md @@ -33,7 +33,7 @@ is deserialized to the fields in this struct so the user can customise the sink's behaviour. ```rust -#[configurable_component(sink("basic"))] +#[configurable_component(sink("basic", "Basic sink."))] #[derive(Clone, Debug)] /// A basic sink that dumps its output to stdout. pub struct BasicConfig { @@ -75,10 +75,12 @@ configuration for the sink. # SinkConfig We need to implement the [`SinkConfig`][sink_config] trait. This is used by -Vector to generate the main Sink from the configuration. +Vector to generate the main Sink from the configuration. Note that type name +given to `typetag` below must match the name of the configurable component above. ```rust #[async_trait::async_trait] +#[typetag::serde(name = "basic")] impl SinkConfig for BasicConfig { async fn build(&self, _cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let healthcheck = Box::pin(async move { Ok(()) }); @@ -198,59 +200,6 @@ sinks-logs = [ "sinks-chronicle", ``` -## Module - -Import this module into Vector. In `src/sinks/mod.rs` add the lines: - - -```diff - #[cfg(feature = "sinks-azure_monitor_logs")] - pub mod azure_monitor_logs; -+ #[cfg(feature = "sinks-basic")] -+ pub mod basic; - #[cfg(feature = "sinks-blackhole")] - pub mod blackhole; -``` - -All sinks are feature gated, this allows us to build custom versions of Vector -with only the components required. We will ignore the feature flag for now with -our new basic sink. - -Next, each sink needs to be added to the [`Sinks`][sinks_enum] enum. Find the -enum in `mod.rs` and add our new sink to it. - -```diff -#[configurable_component] -#[allow(clippy::large_enum_variant)] -#[derive(Clone, Debug)] -#[serde(tag = "type", rename_all = "snake_case")] -#[enum_dispatch(SinkConfig)] -pub enum Sinks { - ... - -+ /// Basic -+ #[cfg(feature = "sinks-basic")] -+ Basic(#[configurable(derived)] basic::BasicConfig), - - ... - -``` - -Then we need to add this to the `get_component_name` function defined below. - -```diff - - fn get_component_name(&self) -> &'static str { - match self { - ... - -+ #[cfg(feature = "sinks-basic")] -+ Self::Basic(config) => config.get_component_name(), - - ... - -``` - # Acknowledgements When our sink finishes processing the event, it needs to acknowledge this so diff --git a/src/components/validation/mod.rs b/src/components/validation/mod.rs index a7687c33264be..7457cd6548ad9 100644 --- a/src/components/validation/mod.rs +++ b/src/components/validation/mod.rs @@ -6,7 +6,7 @@ mod test_case; pub mod util; mod validators; -use crate::{config::BoxedSource, config::BoxedTransform, sinks::Sinks}; +use crate::config::{BoxedSink, BoxedSource, BoxedTransform}; pub use self::resources::*; #[cfg(feature = "component-validation-runner")] @@ -46,7 +46,7 @@ pub enum ComponentConfiguration { Transform(BoxedTransform), /// A sink component. - Sink(Sinks), + Sink(BoxedSink), } /// Configuration for validating a component. @@ -88,7 +88,7 @@ impl ValidationConfiguration { } /// Creates a new `ValidationConfiguration` for a sink. - pub fn from_sink>( + pub fn from_sink>( component_name: &'static str, config: C, external_resource: Option, diff --git a/src/components/validation/runner/config.rs b/src/components/validation/runner/config.rs index f526583d5282c..c087fd8bf809a 100644 --- a/src/components/validation/runner/config.rs +++ b/src/components/validation/runner/config.rs @@ -4,8 +4,8 @@ use crate::{ util::GrpcAddress, ComponentConfiguration, ComponentType, ValidationConfiguration, }, - config::{BoxedSource, BoxedTransform, ConfigBuilder}, - sinks::{vector::VectorConfig as VectorSinkConfig, Sinks}, + config::{BoxedSink, BoxedSource, BoxedTransform, ConfigBuilder}, + sinks::vector::VectorConfig as VectorSinkConfig, sources::vector::VectorConfig as VectorSourceConfig, test_util::next_addr, }; @@ -78,7 +78,7 @@ impl TopologyBuilder { } } - fn from_sink(sink: Sinks) -> Self { + fn from_sink(sink: BoxedSink) -> Self { let (input_edge, input_source) = build_input_edge(); let mut config_builder = ConfigBuilder::default(); @@ -130,7 +130,7 @@ fn build_input_edge() -> (InputEdge, impl Into) { (input_edge, input_source) } -fn build_output_edge() -> (OutputEdge, impl Into) { +fn build_output_edge() -> (OutputEdge, impl Into) { let output_listen_addr = GrpcAddress::from(next_addr()); debug!(endpoint = %output_listen_addr, "Creating controlled output edge."); diff --git a/src/config/builder.rs b/src/config/builder.rs index 301e239627e42..3645ef3755987 100644 --- a/src/config/builder.rs +++ b/src/config/builder.rs @@ -8,18 +8,16 @@ use serde_json::Value; use vector_config::configurable_component; use vector_core::config::GlobalOptions; -use crate::{ - enrichment_tables::EnrichmentTables, providers::Providers, secrets::SecretBackends, - sinks::Sinks, -}; +use crate::{enrichment_tables::EnrichmentTables, providers::Providers, secrets::SecretBackends}; #[cfg(feature = "api")] use super::api; #[cfg(feature = "enterprise")] use super::enterprise; use super::{ - compiler, schema, BoxedSource, BoxedTransform, ComponentKey, Config, EnrichmentTableOuter, - HealthcheckOptions, SinkOuter, SourceOuter, TestDefinition, TransformOuter, + compiler, schema, BoxedSink, BoxedSource, BoxedTransform, ComponentKey, Config, + EnrichmentTableOuter, HealthcheckOptions, SinkOuter, SourceOuter, TestDefinition, + TransformOuter, }; /// A complete Vector configuration. @@ -269,7 +267,12 @@ impl ConfigBuilder { .insert(ComponentKey::from(key.into()), SourceOuter::new(source)); } - pub fn add_sink, S: Into>(&mut self, key: K, inputs: &[&str], sink: S) { + pub fn add_sink, S: Into>( + &mut self, + key: K, + inputs: &[&str], + sink: S, + ) { let inputs = inputs .iter() .map(|value| value.to_string()) diff --git a/src/config/graph.rs b/src/config/graph.rs index 859b590257de2..6f4cdb81d4451 100644 --- a/src/config/graph.rs +++ b/src/config/graph.rs @@ -2,8 +2,8 @@ use indexmap::{set::IndexSet, IndexMap}; use std::collections::{HashMap, HashSet, VecDeque}; use super::{ - schema, ComponentKey, DataType, OutputId, SinkConfig, SinkOuter, SourceOuter, SourceOutput, - TransformOuter, TransformOutput, + schema, ComponentKey, DataType, OutputId, SinkOuter, SourceOuter, SourceOutput, TransformOuter, + TransformOutput, }; #[derive(Debug, Clone)] diff --git a/src/config/mod.rs b/src/config/mod.rs index 59a26d367d3de..61c1a219d9eed 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -54,7 +54,7 @@ pub use loading::{ }; pub use provider::ProviderConfig; pub use secret::SecretBackend; -pub use sink::{SinkConfig, SinkContext, SinkHealthcheckOptions, SinkOuter}; +pub use sink::{BoxedSink, SinkConfig, SinkContext, SinkHealthcheckOptions, SinkOuter}; pub use source::{BoxedSource, SourceConfig, SourceContext, SourceOuter}; pub use transform::{ get_transform_output_ids, BoxedTransform, TransformConfig, TransformContext, TransformOuter, diff --git a/src/config/sink.rs b/src/config/sink.rs index aa25a0e614f08..c0d6aba694b07 100644 --- a/src/config/sink.rs +++ b/src/config/sink.rs @@ -1,15 +1,47 @@ +use std::cell::RefCell; + use async_trait::async_trait; -use enum_dispatch::enum_dispatch; +use dyn_clone::DynClone; use serde::Serialize; use vector_buffers::{BufferConfig, BufferType}; -use vector_config::{configurable_component, Configurable, NamedComponent}; +use vector_config::{ + configurable_component, Configurable, GenerateError, Metadata, NamedComponent, +}; +use vector_config_common::attributes::CustomAttribute; +use vector_config_common::schema::{SchemaGenerator, SchemaObject}; use vector_core::{ config::{AcknowledgementsConfig, GlobalOptions, Input}, sink::VectorSink, }; use super::{id::Inputs, schema, ComponentKey, ProxyConfig, Resource}; -use crate::sinks::{util::UriSerde, Healthcheck, Sinks}; +use crate::sinks::{util::UriSerde, Healthcheck}; + +pub type BoxedSink = Box; + +impl Configurable for BoxedSink { + fn referenceable_name() -> Option<&'static str> { + Some("vector::sinks::Sinks") + } + + fn metadata() -> Metadata { + let mut metadata = Metadata::default(); + metadata.set_description("Configurable sinks in Vector."); + metadata.add_custom_attribute(CustomAttribute::kv("docs::enum_tagging", "internal")); + metadata.add_custom_attribute(CustomAttribute::kv("docs::enum_tag_field", "type")); + metadata + } + + fn generate_schema(gen: &RefCell) -> Result { + vector_config::component::SinkDescription::generate_schemas(gen) + } +} + +impl From for BoxedSink { + fn from(value: T) -> Self { + Box::new(value) + } +} /// Fully resolved sink component. #[configurable_component] @@ -49,7 +81,7 @@ where #[serde(flatten)] #[configurable(metadata(docs::hidden))] - pub inner: Sinks, + pub inner: BoxedSink, } impl SinkOuter @@ -59,7 +91,7 @@ where pub fn new(inputs: I, inner: IS) -> SinkOuter where I: IntoIterator, - IS: Into, + IS: Into, { SinkOuter { inputs: Inputs::from_iter(inputs), @@ -170,8 +202,8 @@ impl From for SinkHealthcheckOptions { /// Generalized interface for describing and building sink components. #[async_trait] -#[enum_dispatch] -pub trait SinkConfig: NamedComponent + core::fmt::Debug + Send + Sync { +#[typetag::serde(tag = "type")] +pub trait SinkConfig: DynClone + NamedComponent + core::fmt::Debug + Send + Sync { /// Builds the sink with the given context. /// /// If the sink is built successfully, `Ok(...)` is returned containing the sink and the sink's @@ -201,6 +233,8 @@ pub trait SinkConfig: NamedComponent + core::fmt::Debug + Send + Sync { fn acknowledgements(&self) -> &AcknowledgementsConfig; } +dyn_clone::clone_trait_object!(SinkConfig); + #[derive(Debug, Clone)] pub struct SinkContext { pub healthcheck: SinkHealthcheckOptions, diff --git a/src/config/unit_test/unit_test_components.rs b/src/config/unit_test/unit_test_components.rs index 157c2306abe3a..3166e396a17e4 100644 --- a/src/config/unit_test/unit_test_components.rs +++ b/src/config/unit_test/unit_test_components.rs @@ -135,7 +135,7 @@ pub struct UnitTestSinkResult { } /// Configuration for the `unit_test` sink. -#[configurable_component(sink("unit_test"))] +#[configurable_component(sink("unit_test", "Unit test."))] #[derive(Clone, Default, Derivative)] #[derivative(Debug)] pub struct UnitTestSinkConfig { @@ -158,6 +158,7 @@ pub struct UnitTestSinkConfig { impl_generate_config_from_default!(UnitTestSinkConfig); #[async_trait::async_trait] +#[typetag::serde(name = "unit_test")] impl SinkConfig for UnitTestSinkConfig { async fn build(&self, _cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let tx = self.result_tx.lock().await.take(); @@ -272,7 +273,7 @@ impl StreamSink for UnitTestSink { } /// Configuration for the `unit_test_stream` sink. -#[configurable_component(sink("unit_test_stream"))] +#[configurable_component(sink("unit_test_stream", "Unit test stream."))] #[derive(Clone, Default)] pub struct UnitTestStreamSinkConfig { /// Sink that receives the processed events. @@ -297,6 +298,7 @@ impl std::fmt::Debug for UnitTestStreamSinkConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "unit_test_stream")] impl SinkConfig for UnitTestStreamSinkConfig { async fn build(&self, _cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let sink = self.sink.lock().await.take().unwrap(); diff --git a/src/sinks/amqp/config.rs b/src/sinks/amqp/config.rs index a83cb7c1f2aad..b266bb1892370 100644 --- a/src/sinks/amqp/config.rs +++ b/src/sinks/amqp/config.rs @@ -36,7 +36,10 @@ impl AmqpPropertiesConfig { /// Configuration for the `amqp` sink. /// /// Supports AMQP version 0.9.1 -#[configurable_component(sink("amqp"))] +#[configurable_component(sink( + "amqp", + "Send events to AMQP 0.9.1 compatible brokers like RabbitMQ." +))] #[derive(Clone, Debug)] pub struct AmqpSinkConfig { /// The exchange to publish messages to. @@ -89,6 +92,7 @@ impl GenerateConfig for AmqpSinkConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "amqp")] impl SinkConfig for AmqpSinkConfig { async fn build(&self, _cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let sink = AmqpSink::new(self.clone()).await?; diff --git a/src/sinks/appsignal/mod.rs b/src/sinks/appsignal/mod.rs index 9d24731f01c9a..32c1247192368 100644 --- a/src/sinks/appsignal/mod.rs +++ b/src/sinks/appsignal/mod.rs @@ -45,7 +45,7 @@ enum FinishError { } /// Configuration for the `appsignal` sink. -#[configurable_component(sink("appsignal"))] +#[configurable_component(sink("appsignal", "Send events to AppSignal."))] #[derive(Clone, Debug, Default)] pub struct AppsignalSinkConfig { /// The URI for the AppSignal API to send data to. @@ -106,6 +106,7 @@ impl SinkBatchSettings for AppsignalDefaultBatchSettings { impl_generate_config_from_default!(AppsignalSinkConfig); #[async_trait::async_trait] +#[typetag::serde(name = "appsignal")] impl SinkConfig for AppsignalSinkConfig { async fn build( &self, diff --git a/src/sinks/aws_cloudwatch_logs/config.rs b/src/sinks/aws_cloudwatch_logs/config.rs index 2197d5b96746c..a03811e4612ba 100644 --- a/src/sinks/aws_cloudwatch_logs/config.rs +++ b/src/sinks/aws_cloudwatch_logs/config.rs @@ -49,7 +49,10 @@ impl ClientBuilder for CloudwatchLogsClientBuilder { } /// Configuration for the `aws_cloudwatch_logs` sink. -#[configurable_component(sink("aws_cloudwatch_logs"))] +#[configurable_component(sink( + "aws_cloudwatch_logs", + "Publish log events to AWS CloudWatch Logs." +))] #[derive(Clone, Debug)] #[serde(deny_unknown_fields)] pub struct CloudwatchLogsSinkConfig { @@ -161,6 +164,7 @@ impl CloudwatchLogsSinkConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "aws_cloudwatch_logs")] impl SinkConfig for CloudwatchLogsSinkConfig { async fn build(&self, cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let batcher_settings = self.batch.into_batcher_settings()?; diff --git a/src/sinks/aws_cloudwatch_metrics/mod.rs b/src/sinks/aws_cloudwatch_metrics/mod.rs index e169dde9b01fb..a1f22ca212e53 100644 --- a/src/sinks/aws_cloudwatch_metrics/mod.rs +++ b/src/sinks/aws_cloudwatch_metrics/mod.rs @@ -46,7 +46,10 @@ impl SinkBatchSettings for CloudWatchMetricsDefaultBatchSettings { } /// Configuration for the `aws_cloudwatch_metrics` sink. -#[configurable_component(sink("aws_cloudwatch_metrics"))] +#[configurable_component(sink( + "aws_cloudwatch_metrics", + "Publish metric events to AWS CloudWatch Metrics." +))] #[derive(Clone, Debug, Default)] #[serde(deny_unknown_fields)] pub struct CloudWatchMetricsSinkConfig { @@ -120,6 +123,7 @@ impl ClientBuilder for CloudwatchMetricsClientBuilder { } #[async_trait::async_trait] +#[typetag::serde(name = "aws_cloudwatch_metrics")] impl SinkConfig for CloudWatchMetricsSinkConfig { async fn build( &self, diff --git a/src/sinks/aws_kinesis/firehose/config.rs b/src/sinks/aws_kinesis/firehose/config.rs index aca15796d87c9..d5bbd93f06c78 100644 --- a/src/sinks/aws_kinesis/firehose/config.rs +++ b/src/sinks/aws_kinesis/firehose/config.rs @@ -66,7 +66,10 @@ impl SinkBatchSettings for KinesisFirehoseDefaultBatchSettings { } /// Configuration for the `aws_kinesis_firehose` sink. -#[configurable_component(sink("aws_kinesis_firehose"))] +#[configurable_component(sink( + "aws_kinesis_firehose", + "Publish logs to AWS Kinesis Data Firehose topics." +))] #[derive(Clone, Debug)] pub struct KinesisFirehoseSinkConfig { #[serde(flatten)] @@ -119,6 +122,7 @@ impl KinesisFirehoseSinkConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "aws_kinesis_firehose")] impl SinkConfig for KinesisFirehoseSinkConfig { async fn build(&self, cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let client = self.create_client(&cx.proxy).await?; diff --git a/src/sinks/aws_kinesis/streams/config.rs b/src/sinks/aws_kinesis/streams/config.rs index 515c5fa66ab0e..8949f90d40352 100644 --- a/src/sinks/aws_kinesis/streams/config.rs +++ b/src/sinks/aws_kinesis/streams/config.rs @@ -67,7 +67,10 @@ impl SinkBatchSettings for KinesisDefaultBatchSettings { } /// Configuration for the `aws_kinesis_streams` sink. -#[configurable_component(sink("aws_kinesis_streams"))] +#[configurable_component(sink( + "aws_kinesis_streams", + "Publish logs to AWS Kinesis Streams topics." +))] #[derive(Clone, Debug)] pub struct KinesisStreamsSinkConfig { #[serde(flatten)] @@ -126,6 +129,7 @@ impl KinesisStreamsSinkConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "aws_kinesis_streams")] impl SinkConfig for KinesisStreamsSinkConfig { async fn build(&self, cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let client = self.create_client(&cx.proxy).await?; diff --git a/src/sinks/aws_s3/config.rs b/src/sinks/aws_s3/config.rs index 27afbcd706d21..6123ee737d22f 100644 --- a/src/sinks/aws_s3/config.rs +++ b/src/sinks/aws_s3/config.rs @@ -33,7 +33,10 @@ use crate::{ }; /// Configuration for the `aws_s3` sink. -#[configurable_component(sink("aws_s3"))] +#[configurable_component(sink( + "aws_s3", + "Store observability events in the AWS S3 object storage system." +))] #[derive(Clone, Debug)] #[serde(deny_unknown_fields)] pub struct S3SinkConfig { @@ -166,6 +169,7 @@ impl GenerateConfig for S3SinkConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "aws_s3")] impl SinkConfig for S3SinkConfig { async fn build(&self, cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let service = self.create_service(&cx.proxy).await?; diff --git a/src/sinks/aws_sqs/config.rs b/src/sinks/aws_sqs/config.rs index e303c28d5a45c..45579f52925bc 100644 --- a/src/sinks/aws_sqs/config.rs +++ b/src/sinks/aws_sqs/config.rs @@ -32,7 +32,10 @@ pub(super) enum BuildError { } /// Configuration for the `aws_sqs` sink. -#[configurable_component(sink("aws_sqs"))] +#[configurable_component(sink( + "aws_sqs", + "Publish observability events to AWS Simple Queue Service topics." +))] #[derive(Clone, Debug)] #[serde(deny_unknown_fields)] pub struct SqsSinkConfig { @@ -111,6 +114,7 @@ impl GenerateConfig for SqsSinkConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "aws_sqs")] impl SinkConfig for SqsSinkConfig { async fn build( &self, diff --git a/src/sinks/axiom.rs b/src/sinks/axiom.rs index a8a73a52f7c40..b94c7f6e7f69c 100644 --- a/src/sinks/axiom.rs +++ b/src/sinks/axiom.rs @@ -16,7 +16,7 @@ use crate::{ static CLOUD_URL: &str = "https://api.axiom.co"; /// Configuration for the `axiom` sink. -#[configurable_component(sink("axiom"))] +#[configurable_component(sink("axiom", "Deliver log events to Axiom."))] #[derive(Clone, Debug, Default)] pub struct AxiomConfig { /// URI of the Axiom endpoint to send data to. @@ -77,6 +77,7 @@ impl GenerateConfig for AxiomConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "axiom")] impl SinkConfig for AxiomConfig { async fn build(&self, cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let mut request = self.request.clone(); diff --git a/src/sinks/azure_blob/config.rs b/src/sinks/azure_blob/config.rs index 507633ff54165..2fb5287fa9ca3 100644 --- a/src/sinks/azure_blob/config.rs +++ b/src/sinks/azure_blob/config.rs @@ -25,7 +25,10 @@ use crate::{ }; /// Configuration for the `azure_blob` sink. -#[configurable_component(sink("azure_blob"))] +#[configurable_component(sink( + "azure_blob", + "Store your observability data in Azure Blob Storage." +))] #[derive(Clone, Debug)] #[serde(deny_unknown_fields)] pub struct AzureBlobSinkConfig { @@ -164,6 +167,7 @@ impl GenerateConfig for AzureBlobSinkConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "azure_blob")] impl SinkConfig for AzureBlobSinkConfig { async fn build(&self, _cx: SinkContext) -> Result<(VectorSink, Healthcheck)> { let client = azure_common::config::build_client( diff --git a/src/sinks/azure_monitor_logs.rs b/src/sinks/azure_monitor_logs.rs index 77e675daf3074..aef40146c8d2a 100644 --- a/src/sinks/azure_monitor_logs.rs +++ b/src/sinks/azure_monitor_logs.rs @@ -39,7 +39,10 @@ fn default_host() -> String { } /// Configuration for the `azure_monitor_logs` sink. -#[configurable_component(sink("azure_monitor_logs"))] +#[configurable_component(sink( + "azure_monitor_logs", + "Publish log events to the Azure Monitor Logs service." +))] #[derive(Clone, Debug)] #[serde(deny_unknown_fields)] pub struct AzureMonitorLogsConfig { @@ -177,6 +180,7 @@ const SHARED_KEY: &str = "SharedKey"; const API_VERSION: &str = "2016-04-01"; #[async_trait::async_trait] +#[typetag::serde(name = "azure_monitor_logs")] impl SinkConfig for AzureMonitorLogsConfig { async fn build(&self, cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let batch_settings = self diff --git a/src/sinks/blackhole/config.rs b/src/sinks/blackhole/config.rs index 070f32a99c0f2..d2d69e75cc44f 100644 --- a/src/sinks/blackhole/config.rs +++ b/src/sinks/blackhole/config.rs @@ -15,7 +15,10 @@ const fn default_print_interval_secs() -> Duration { /// Configuration for the `blackhole` sink. #[serde_as] -#[configurable_component(sink("blackhole"))] +#[configurable_component(sink( + "blackhole", + "Send observability events nowhere, which can be useful for debugging purposes." +))] #[derive(Clone, Debug, Derivative)] #[serde(deny_unknown_fields, default)] #[derivative(Default)] @@ -46,6 +49,7 @@ pub struct BlackholeConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "blackhole")] impl SinkConfig for BlackholeConfig { async fn build(&self, _cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let sink = BlackholeSink::new(self.clone()); diff --git a/src/sinks/clickhouse/config.rs b/src/sinks/clickhouse/config.rs index a5ae3763f2ad5..08299eb541099 100644 --- a/src/sinks/clickhouse/config.rs +++ b/src/sinks/clickhouse/config.rs @@ -17,7 +17,7 @@ use crate::{ use super::http_sink::build_http_sink; /// Configuration for the `clickhouse` sink. -#[configurable_component(sink("clickhouse"))] +#[configurable_component(sink("clickhouse", "Deliver log data to a ClickHouse database."))] #[derive(Clone, Debug, Default)] #[serde(deny_unknown_fields)] pub struct ClickhouseConfig { @@ -79,6 +79,7 @@ pub struct ClickhouseConfig { impl_generate_config_from_default!(ClickhouseConfig); #[async_trait::async_trait] +#[typetag::serde(name = "clickhouse")] impl SinkConfig for ClickhouseConfig { async fn build(&self, cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { // later we can build different sink(http, native) here diff --git a/src/sinks/console/config.rs b/src/sinks/console/config.rs index dcdefb12fb949..3aa1c46bb62af 100644 --- a/src/sinks/console/config.rs +++ b/src/sinks/console/config.rs @@ -33,7 +33,10 @@ pub enum Target { } /// Configuration for the `console` sink. -#[configurable_component(sink("console"))] +#[configurable_component(sink( + "console", + "Display observability events in the console, which can be useful for debugging purposes." +))] #[derive(Clone, Debug)] #[serde(deny_unknown_fields)] pub struct ConsoleSinkConfig { @@ -69,6 +72,7 @@ impl GenerateConfig for ConsoleSinkConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "console")] impl SinkConfig for ConsoleSinkConfig { async fn build(&self, _cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let transformer = self.encoding.transformer(); diff --git a/src/sinks/databend/config.rs b/src/sinks/databend/config.rs index 4a47adb01de8b..69a464090c445 100644 --- a/src/sinks/databend/config.rs +++ b/src/sinks/databend/config.rs @@ -30,7 +30,7 @@ use super::{ }; /// Configuration for the `databend` sink. -#[configurable_component(sink("databend"))] +#[configurable_component(sink("databend", "Deliver log data to a Databend database."))] #[derive(Clone, Debug)] #[serde(deny_unknown_fields)] pub struct DatabendConfig { @@ -103,6 +103,7 @@ impl DatabendConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "databend")] impl SinkConfig for DatabendConfig { async fn build(&self, cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let auth = self.auth.choose_one(&self.endpoint.auth)?; diff --git a/src/sinks/datadog/events/config.rs b/src/sinks/datadog/events/config.rs index 8ca941d1cf0cb..606d364b32ec8 100644 --- a/src/sinks/datadog/events/config.rs +++ b/src/sinks/datadog/events/config.rs @@ -24,7 +24,10 @@ use crate::{ }; /// Configuration for the `datadog_events` sink. -#[configurable_component(sink("datadog_events"))] +#[configurable_component(sink( + "datadog_events", + "Publish observability events to the Datadog Events API." +))] #[derive(Clone, Debug, Default)] #[serde(deny_unknown_fields)] pub struct DatadogEventsConfig { @@ -89,6 +92,7 @@ impl DatadogEventsConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "datadog_events")] impl SinkConfig for DatadogEventsConfig { async fn build(&self, cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let client = self.build_client(cx.proxy())?; diff --git a/src/sinks/datadog/logs/config.rs b/src/sinks/datadog/logs/config.rs index 5e1d6cc150962..80fb5293257a1 100644 --- a/src/sinks/datadog/logs/config.rs +++ b/src/sinks/datadog/logs/config.rs @@ -46,7 +46,7 @@ impl SinkBatchSettings for DatadogLogsDefaultBatchSettings { } /// Configuration for the `datadog_logs` sink. -#[configurable_component(sink("datadog_logs"))] +#[configurable_component(sink("datadog_logs", "Publish log events to Datadog."))] #[derive(Clone, Debug, Default)] #[serde(deny_unknown_fields)] pub struct DatadogLogsConfig { @@ -160,6 +160,7 @@ impl DatadogLogsConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "datadog_logs")] impl SinkConfig for DatadogLogsConfig { async fn build(&self, cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let client = self.create_client(&cx.proxy)?; @@ -193,7 +194,7 @@ impl SinkConfig for DatadogLogsConfig { #[cfg(test)] mod test { - use crate::sinks::datadog::logs::DatadogLogsConfig; + use super::super::config::DatadogLogsConfig; #[test] fn generate_config() { diff --git a/src/sinks/datadog/logs/integration_tests.rs b/src/sinks/datadog/logs/integration_tests.rs index 78156c1cf5c77..0d34486ec0897 100644 --- a/src/sinks/datadog/logs/integration_tests.rs +++ b/src/sinks/datadog/logs/integration_tests.rs @@ -1,9 +1,9 @@ use indoc::indoc; use vector_core::event::{BatchNotifier, BatchStatus}; +use super::config::DatadogLogsConfig; use crate::{ config::SinkConfig, - sinks::datadog::logs::DatadogLogsConfig, sinks::util::test::load_sink, test_util::{ components::{run_and_assert_sink_compliance, SINK_TAGS}, diff --git a/src/sinks/datadog/logs/mod.rs b/src/sinks/datadog/logs/mod.rs index 02b857a160181..b20a00201a7a1 100644 --- a/src/sinks/datadog/logs/mod.rs +++ b/src/sinks/datadog/logs/mod.rs @@ -27,5 +27,3 @@ mod tests; mod config; mod service; mod sink; - -pub(crate) use config::DatadogLogsConfig; diff --git a/src/sinks/datadog/logs/tests.rs b/src/sinks/datadog/logs/tests.rs index 86430fd5890bf..efe366120100e 100644 --- a/src/sinks/datadog/logs/tests.rs +++ b/src/sinks/datadog/logs/tests.rs @@ -17,8 +17,6 @@ use crate::{ config::SinkConfig, http::HttpError, sinks::{ - datadog::logs::DatadogLogsConfig, - datadog::DatadogApiError, util::retries::RetryLogic, util::test::{build_test_server_status, load_sink}, }, @@ -32,7 +30,7 @@ use crate::{ tls::TlsError, }; -use super::service::LogApiRetry; +use super::{super::DatadogApiError, config::DatadogLogsConfig, service::LogApiRetry}; // The sink must support v1 and v2 API endpoints which have different codes for // signaling status. This enum allows us to signal which API endpoint and what diff --git a/src/sinks/datadog/metrics/config.rs b/src/sinks/datadog/metrics/config.rs index 4de73c5cf8ed6..1acedc003c079 100644 --- a/src/sinks/datadog/metrics/config.rs +++ b/src/sinks/datadog/metrics/config.rs @@ -86,7 +86,7 @@ impl DatadogMetricsEndpointConfiguration { } /// Configuration for the `datadog_metrics` sink. -#[configurable_component(sink("datadog_metrics"))] +#[configurable_component(sink("datadog_metrics", "Publish metric events to Datadog."))] #[derive(Clone, Debug, Default)] #[serde(deny_unknown_fields)] pub struct DatadogMetricsConfig { @@ -118,6 +118,7 @@ pub struct DatadogMetricsConfig { impl_generate_config_from_default!(DatadogMetricsConfig); #[async_trait::async_trait] +#[typetag::serde(name = "datadog_metrics")] impl SinkConfig for DatadogMetricsConfig { async fn build(&self, cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let client = self.build_client(&cx.proxy)?; diff --git a/src/sinks/datadog/traces/config.rs b/src/sinks/datadog/traces/config.rs index 533b874a539da..7bafd0549f323 100644 --- a/src/sinks/datadog/traces/config.rs +++ b/src/sinks/datadog/traces/config.rs @@ -54,7 +54,7 @@ impl SinkBatchSettings for DatadogTracesDefaultBatchSettings { } /// Configuration for the `datadog_traces` sink. -#[configurable_component(sink("datadog_traces"))] +#[configurable_component(sink("datadog_traces", "Publish traces to Datadog."))] #[derive(Clone, Debug, Default)] #[serde(deny_unknown_fields)] pub struct DatadogTracesConfig { @@ -211,6 +211,7 @@ impl DatadogTracesConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "datadog_traces")] impl SinkConfig for DatadogTracesConfig { async fn build(&self, cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let client = self.build_client(&cx.proxy)?; diff --git a/src/sinks/datadog_archives.rs b/src/sinks/datadog_archives.rs index e439481c076a1..d92265ae05a42 100644 --- a/src/sinks/datadog_archives.rs +++ b/src/sinks/datadog_archives.rs @@ -865,6 +865,7 @@ impl NamedComponent for DatadogArchivesSinkConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "datadog_archives")] impl SinkConfig for DatadogArchivesSinkConfig { async fn build(&self, cx: SinkContext) -> crate::Result<(VectorSink, super::Healthcheck)> { let sink_and_healthcheck = self.build_sink(cx).await?; diff --git a/src/sinks/elasticsearch/config.rs b/src/sinks/elasticsearch/config.rs index fbfc88edcc3c8..1e6c9d708894a 100644 --- a/src/sinks/elasticsearch/config.rs +++ b/src/sinks/elasticsearch/config.rs @@ -40,7 +40,7 @@ use vrl::value::Kind; pub const DATA_STREAM_TIMESTAMP_KEY: &str = "@timestamp"; /// Configuration for the `elasticsearch` sink. -#[configurable_component(sink("elasticsearch"))] +#[configurable_component(sink("elasticsearch", "Index observability events in Elasticsearch."))] #[derive(Clone, Debug)] #[serde(deny_unknown_fields)] pub struct ElasticsearchConfig { @@ -466,6 +466,7 @@ impl DataStreamConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "elasticsearch")] impl SinkConfig for ElasticsearchConfig { async fn build(&self, cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let commons = ElasticsearchCommon::parse_many(self, cx.proxy()).await?; diff --git a/src/sinks/file/mod.rs b/src/sinks/file/mod.rs index c8b0784ddd435..04f166aa986fb 100644 --- a/src/sinks/file/mod.rs +++ b/src/sinks/file/mod.rs @@ -40,7 +40,7 @@ use bytes_path::BytesPath; /// Configuration for the `file` sink. #[serde_as] -#[configurable_component(sink("file"))] +#[configurable_component(sink("file", "Output observability events into files."))] #[derive(Clone, Debug)] #[serde(deny_unknown_fields)] pub struct FileSinkConfig { @@ -170,6 +170,7 @@ impl OutFile { } #[async_trait::async_trait] +#[typetag::serde(name = "file")] impl SinkConfig for FileSinkConfig { async fn build( &self, diff --git a/src/sinks/gcp/chronicle_unstructured.rs b/src/sinks/gcp/chronicle_unstructured.rs index a9390b4335d37..3f7b3d4494d25 100644 --- a/src/sinks/gcp/chronicle_unstructured.rs +++ b/src/sinks/gcp/chronicle_unstructured.rs @@ -97,7 +97,10 @@ impl SinkBatchSettings for ChronicleUnstructuredDefaultBatchSettings { } /// Configuration for the `gcp_chronicle_unstructured` sink. -#[configurable_component(sink("gcp_chronicle_unstructured"))] +#[configurable_component(sink( + "gcp_chronicle_unstructured", + "Store unstructured log events in Google Chronicle." +))] #[derive(Clone, Debug)] pub struct ChronicleUnstructuredConfig { /// The endpoint to send data to. @@ -190,6 +193,7 @@ pub enum ChronicleError { } #[async_trait::async_trait] +#[typetag::serde(name = "gcp_chronicle_unstructured")] impl SinkConfig for ChronicleUnstructuredConfig { async fn build(&self, cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let creds = self.auth.build(Scope::MalachiteIngestion).await?; diff --git a/src/sinks/gcp/cloud_storage.rs b/src/sinks/gcp/cloud_storage.rs index 13983ad90bc6e..5b172586ee0cf 100644 --- a/src/sinks/gcp/cloud_storage.rs +++ b/src/sinks/gcp/cloud_storage.rs @@ -49,7 +49,10 @@ pub enum GcsHealthcheckError { } /// Configuration for the `gcp_cloud_storage` sink. -#[configurable_component(sink("gcp_cloud_storage"))] +#[configurable_component(sink( + "gcp_cloud_storage", + "Store observability events in GCP Cloud Storage." +))] #[derive(Clone, Debug)] #[serde(deny_unknown_fields)] pub struct GcsSinkConfig { @@ -201,6 +204,7 @@ impl GenerateConfig for GcsSinkConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "gcp_cloud_storage")] impl SinkConfig for GcsSinkConfig { async fn build(&self, cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let auth = self.auth.build(Scope::DevStorageReadWrite).await?; diff --git a/src/sinks/gcp/pubsub.rs b/src/sinks/gcp/pubsub.rs index dded23587438f..a950c3dc46dab 100644 --- a/src/sinks/gcp/pubsub.rs +++ b/src/sinks/gcp/pubsub.rs @@ -45,7 +45,10 @@ impl SinkBatchSettings for PubsubDefaultBatchSettings { } /// Configuration for the `gcp_pubsub` sink. -#[configurable_component(sink("gcp_pubsub"))] +#[configurable_component(sink( + "gcp_pubsub", + "Publish observability events to GCP's Pub/Sub messaging system." +))] #[derive(Clone, Debug)] pub struct PubsubConfig { /// The project name to which to publish events. @@ -111,6 +114,7 @@ impl GenerateConfig for PubsubConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "gcp_pubsub")] impl SinkConfig for PubsubConfig { async fn build(&self, cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let sink = PubsubSink::from_config(self).await?; diff --git a/src/sinks/gcp/stackdriver_logs.rs b/src/sinks/gcp/stackdriver_logs.rs index 8e7c43276bd20..e79287429071d 100644 --- a/src/sinks/gcp/stackdriver_logs.rs +++ b/src/sinks/gcp/stackdriver_logs.rs @@ -36,7 +36,10 @@ enum HealthcheckError { } /// Configuration for the `gcp_stackdriver_logs` sink. -#[configurable_component(sink("gcp_stackdriver_logs"))] +#[configurable_component(sink( + "gcp_stackdriver_logs", + "Deliver logs to GCP's Cloud Operations suite." +))] #[derive(Clone, Debug, Default)] #[serde(deny_unknown_fields)] pub struct StackdriverConfig { @@ -202,6 +205,7 @@ fn label_examples() -> HashMap { impl_generate_config_from_default!(StackdriverConfig); #[async_trait::async_trait] +#[typetag::serde(name = "gcp_stackdriver_logs")] impl SinkConfig for StackdriverConfig { async fn build(&self, cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let auth = self.auth.build(Scope::LoggingWrite).await?; diff --git a/src/sinks/gcp/stackdriver_metrics.rs b/src/sinks/gcp/stackdriver_metrics.rs index a68140e2bced8..c18a8318b7f79 100644 --- a/src/sinks/gcp/stackdriver_metrics.rs +++ b/src/sinks/gcp/stackdriver_metrics.rs @@ -36,7 +36,10 @@ impl SinkBatchSettings for StackdriverMetricsDefaultBatchSettings { } /// Configuration for the `gcp_stackdriver_metrics` sink. -#[configurable_component(sink("gcp_stackdriver_metrics"))] +#[configurable_component(sink( + "gcp_stackdriver_metrics", + "Deliver metrics to GCP's Cloud Monitoring system." +))] #[derive(Clone, Debug, Default)] pub struct StackdriverConfig { #[serde(skip, default = "default_endpoint")] @@ -93,6 +96,7 @@ fn default_endpoint() -> String { impl_generate_config_from_default!(StackdriverConfig); #[async_trait::async_trait] +#[typetag::serde(name = "gcp_stackdriver_metrics")] impl SinkConfig for StackdriverConfig { async fn build(&self, cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let auth = self.auth.build(Scope::MonitoringWrite).await?; diff --git a/src/sinks/honeycomb.rs b/src/sinks/honeycomb.rs index f9a05c2a7a5b0..559a1f4a5bf85 100644 --- a/src/sinks/honeycomb.rs +++ b/src/sinks/honeycomb.rs @@ -19,7 +19,7 @@ use crate::{ }; /// Configuration for the `honeycomb` sink. -#[configurable_component(sink("honeycomb"))] +#[configurable_component(sink("honeycomb", "Deliver log events to Honeycomb."))] #[derive(Clone, Debug)] pub struct HoneycombConfig { // This endpoint is not user-configurable and only exists for testing purposes @@ -85,6 +85,7 @@ impl GenerateConfig for HoneycombConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "honeycomb")] impl SinkConfig for HoneycombConfig { async fn build( &self, diff --git a/src/sinks/http.rs b/src/sinks/http.rs index 1d21b052c2c82..8f7d0fdf8b633 100644 --- a/src/sinks/http.rs +++ b/src/sinks/http.rs @@ -29,7 +29,7 @@ use crate::{ }; /// Configuration for the `http` sink. -#[configurable_component(sink("http"))] +#[configurable_component(sink("http", "Deliver observability event data to an HTTP server."))] #[derive(Clone, Debug)] #[serde(deny_unknown_fields)] pub struct HttpSinkConfig { @@ -201,6 +201,7 @@ fn default_sink(encoding: EncodingConfigWithFraming) -> HttpSink { } #[async_trait::async_trait] +#[typetag::serde(name = "http")] impl SinkConfig for HttpSinkConfig { async fn build( &self, diff --git a/src/sinks/humio/logs.rs b/src/sinks/humio/logs.rs index 6af56db905115..6e30e66f29ee9 100644 --- a/src/sinks/humio/logs.rs +++ b/src/sinks/humio/logs.rs @@ -26,7 +26,7 @@ use crate::{ pub(super) const HOST: &str = "https://cloud.humio.com"; /// Configuration for the `humio_logs` sink. -#[configurable_component(sink("humio_logs"))] +#[configurable_component(sink("humio_logs", "Deliver log event data to Humio."))] #[derive(Clone, Debug)] #[serde(deny_unknown_fields)] pub struct HumioLogsConfig { @@ -168,6 +168,7 @@ impl GenerateConfig for HumioLogsConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "humio_logs")] impl SinkConfig for HumioLogsConfig { async fn build(&self, cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { self.build_hec_config().build(cx).await diff --git a/src/sinks/humio/metrics.rs b/src/sinks/humio/metrics.rs index c79aa6b852d1a..a336f60590aa9 100644 --- a/src/sinks/humio/metrics.rs +++ b/src/sinks/humio/metrics.rs @@ -38,7 +38,7 @@ use crate::{ // `humio_logs` config here. // // [1]: https://github.com/serde-rs/serde/issues/1504 -#[configurable_component(sink("humio_metrics"))] +#[configurable_component(sink("humio_metrics", "Deliver metric event data to Humio."))] #[derive(Clone, Debug)] #[serde(deny_unknown_fields)] pub struct HumioMetricsConfig { @@ -151,6 +151,7 @@ impl GenerateConfig for HumioMetricsConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "humio_metrics")] impl SinkConfig for HumioMetricsConfig { async fn build(&self, cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let transform = self diff --git a/src/sinks/influxdb/logs.rs b/src/sinks/influxdb/logs.rs index 96c5be07ee96f..fe2e44b950368 100644 --- a/src/sinks/influxdb/logs.rs +++ b/src/sinks/influxdb/logs.rs @@ -41,7 +41,7 @@ impl SinkBatchSettings for InfluxDbLogsDefaultBatchSettings { } /// Configuration for the `influxdb_logs` sink. -#[configurable_component(sink("influxdb_logs"))] +#[configurable_component(sink("influxdb_logs", "Deliver log event data to InfluxDB."))] #[derive(Clone, Debug, Default)] #[serde(deny_unknown_fields)] pub struct InfluxDbLogsConfig { @@ -157,6 +157,7 @@ impl GenerateConfig for InfluxDbLogsConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "influxdb_logs")] impl SinkConfig for InfluxDbLogsConfig { async fn build(&self, cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let measurement = self.get_measurement()?; diff --git a/src/sinks/influxdb/metrics.rs b/src/sinks/influxdb/metrics.rs index e8f8d281ca106..5c6f98856198a 100644 --- a/src/sinks/influxdb/metrics.rs +++ b/src/sinks/influxdb/metrics.rs @@ -52,7 +52,7 @@ impl SinkBatchSettings for InfluxDbDefaultBatchSettings { } /// Configuration for the `influxdb_metrics` sink. -#[configurable_component(sink("influxdb_metrics"))] +#[configurable_component(sink("influxdb_metrics", "Deliver metric event data to InfluxDB."))] #[derive(Clone, Debug, Default)] #[serde(deny_unknown_fields)] pub struct InfluxDbConfig { @@ -122,6 +122,7 @@ struct InfluxDbRequest { impl_generate_config_from_default!(InfluxDbConfig); #[async_trait::async_trait] +#[typetag::serde(name = "influxdb_metrics")] impl SinkConfig for InfluxDbConfig { async fn build(&self, cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let tls_settings = TlsSettings::from_options(&self.tls)?; diff --git a/src/sinks/kafka/config.rs b/src/sinks/kafka/config.rs index 9615c22ec7280..57cb86c2001dd 100644 --- a/src/sinks/kafka/config.rs +++ b/src/sinks/kafka/config.rs @@ -20,7 +20,10 @@ pub(crate) const QUEUED_MIN_MESSAGES: u64 = 100000; /// Configuration for the `kafka` sink. #[serde_as] -#[configurable_component(sink("kafka"))] +#[configurable_component(sink( + "kafka", + "Publish observability event data to Apache Kafka topics." +))] #[derive(Clone, Debug)] #[serde(deny_unknown_fields)] pub struct KafkaSinkConfig { @@ -262,6 +265,7 @@ impl GenerateConfig for KafkaSinkConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "kafka")] impl SinkConfig for KafkaSinkConfig { async fn build(&self, _cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let sink = KafkaSink::new(self.clone())?; diff --git a/src/sinks/loki/config.rs b/src/sinks/loki/config.rs index 6cb74c426ec08..f72c68c964007 100644 --- a/src/sinks/loki/config.rs +++ b/src/sinks/loki/config.rs @@ -52,7 +52,7 @@ fn default_loki_path() -> String { } /// Configuration for the `loki` sink. -#[configurable_component(sink("loki"))] +#[configurable_component(sink("loki", "Deliver log event data to the Loki aggregation system."))] #[derive(Clone, Debug)] #[serde(deny_unknown_fields)] pub struct LokiConfig { @@ -211,6 +211,7 @@ impl LokiConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "loki")] impl SinkConfig for LokiConfig { async fn build( &self, diff --git a/src/sinks/mezmo.rs b/src/sinks/mezmo.rs index 00a8bf09278bc..a79179ef3f0d0 100644 --- a/src/sinks/mezmo.rs +++ b/src/sinks/mezmo.rs @@ -25,7 +25,7 @@ use crate::{ const PATH: &str = "/logs/ingest"; /// Configuration for the `logdna` sink. -#[configurable_component(sink("logdna"))] +#[configurable_component(sink("logdna", "Deliver log event data to LogDNA."))] #[configurable(metadata( deprecated = "The `logdna` sink has been renamed. Please use `mezmo` instead." ))] @@ -39,6 +39,7 @@ impl GenerateConfig for LogdnaConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "logdna")] impl SinkConfig for LogdnaConfig { async fn build( &self, @@ -58,7 +59,7 @@ impl SinkConfig for LogdnaConfig { } /// Configuration for the `mezmo` (formerly `logdna`) sink. -#[configurable_component(sink("mezmo"))] +#[configurable_component(sink("mezmo", "Deliver log event data to Mezmo."))] #[derive(Clone, Debug)] pub struct MezmoConfig { /// The Ingestion API key. @@ -155,6 +156,7 @@ impl GenerateConfig for MezmoConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "mezmo")] impl SinkConfig for MezmoConfig { async fn build( &self, diff --git a/src/sinks/mod.rs b/src/sinks/mod.rs index b21c5749841c6..d64d92e37664b 100644 --- a/src/sinks/mod.rs +++ b/src/sinks/mod.rs @@ -1,5 +1,4 @@ #![allow(missing_docs)] -use enum_dispatch::enum_dispatch; use futures::future::BoxFuture; use snafu::Snafu; @@ -104,14 +103,8 @@ pub mod webhdfs; #[cfg(feature = "sinks-websocket")] pub mod websocket; -use vector_config::{configurable_component, NamedComponent}; pub use vector_core::{config::Input, sink::VectorSink}; -use crate::config::{ - unit_test::{UnitTestSinkConfig, UnitTestStreamSinkConfig}, - AcknowledgementsConfig, Resource, SinkConfig, SinkContext, -}; - pub type Healthcheck = BoxFuture<'static, crate::Result<()>>; /// Common build errors @@ -133,385 +126,3 @@ pub enum HealthcheckError { #[snafu(display("Unexpected status: {}", status))] UnexpectedStatus { status: ::http::StatusCode }, } - -/// Configurable sinks in Vector. -#[configurable_component] -#[allow(clippy::large_enum_variant)] -#[derive(Clone, Debug)] -#[serde(tag = "type", rename_all = "snake_case")] -#[enum_dispatch(SinkConfig)] -pub enum Sinks { - /// Send events to AMQP 0.9.1 compatible brokers like RabbitMQ. - #[cfg(feature = "sinks-amqp")] - Amqp(amqp::AmqpSinkConfig), - - /// Send events to AppSignal. - #[cfg(feature = "sinks-appsignal")] - Appsignal(appsignal::AppsignalSinkConfig), - - /// Publish log events to AWS CloudWatch Logs. - #[cfg(feature = "sinks-aws_cloudwatch_logs")] - AwsCloudwatchLogs(aws_cloudwatch_logs::CloudwatchLogsSinkConfig), - - /// Publish metric events to AWS CloudWatch Metrics. - #[cfg(feature = "sinks-aws_cloudwatch_metrics")] - AwsCloudwatchMetrics(aws_cloudwatch_metrics::CloudWatchMetricsSinkConfig), - - /// Publish logs to AWS Kinesis Data Firehose topics. - #[cfg(feature = "sinks-aws_kinesis_firehose")] - #[configurable(metadata(docs::human_name = "AWS Kinesis Data Firehose Logs"))] - AwsKinesisFirehose(aws_kinesis::firehose::KinesisFirehoseSinkConfig), - - /// Publish logs to AWS Kinesis Streams topics. - #[cfg(feature = "sinks-aws_kinesis_streams")] - #[configurable(metadata(docs::human_name = "AWS Kinesis Streams Logs"))] - AwsKinesisStreams(aws_kinesis::streams::KinesisStreamsSinkConfig), - - /// Store observability events in the AWS S3 object storage system. - #[cfg(feature = "sinks-aws_s3")] - AwsS3(aws_s3::S3SinkConfig), - - /// Publish observability events to AWS Simple Queue Service topics. - #[cfg(feature = "sinks-aws_sqs")] - AwsSqs(aws_sqs::SqsSinkConfig), - - /// Deliver log events to Axiom. - #[cfg(feature = "sinks-axiom")] - Axiom(axiom::AxiomConfig), - - /// Store your observability data in Azure Blob Storage. - #[cfg(feature = "sinks-azure_blob")] - #[configurable(metadata(docs::human_name = "Azure Blob Storage"))] - AzureBlob(azure_blob::AzureBlobSinkConfig), - - /// Publish log events to the Azure Monitor Logs service. - #[cfg(feature = "sinks-azure_monitor_logs")] - AzureMonitorLogs(azure_monitor_logs::AzureMonitorLogsConfig), - - /// Send observability events nowhere, which can be useful for debugging purposes. - #[cfg(feature = "sinks-blackhole")] - Blackhole(blackhole::BlackholeConfig), - - /// Deliver log data to a ClickHouse database. - #[cfg(feature = "sinks-clickhouse")] - Clickhouse(clickhouse::ClickhouseConfig), - - /// Display observability events in the console, which can be useful for debugging purposes. - #[cfg(feature = "sinks-console")] - Console(console::ConsoleSinkConfig), - - /// Deliver log data to a Databend database. - #[cfg(feature = "sinks-databend")] - Databend(databend::DatabendConfig), - - /// Send events to Datadog Archives. - #[cfg(feature = "sinks-datadog_archives")] - DatadogArchives(datadog_archives::DatadogArchivesSinkConfig), - - /// Publish observability events to the Datadog Events API. - #[cfg(feature = "sinks-datadog_events")] - DatadogEvents(datadog::events::DatadogEventsConfig), - - /// Publish log events to Datadog. - #[cfg(feature = "sinks-datadog_logs")] - DatadogLogs(datadog::logs::DatadogLogsConfig), - - /// Publish metric events to Datadog. - #[cfg(feature = "sinks-datadog_metrics")] - DatadogMetrics(datadog::metrics::DatadogMetricsConfig), - - /// Publish traces to Datadog. - #[cfg(feature = "sinks-datadog_traces")] - DatadogTraces(datadog::traces::DatadogTracesConfig), - - /// Index observability events in Elasticsearch. - #[cfg(feature = "sinks-elasticsearch")] - Elasticsearch(elasticsearch::ElasticsearchConfig), - - /// Output observability events into files. - #[cfg(feature = "sinks-file")] - File(file::FileSinkConfig), - - /// Store unstructured log events in Google Chronicle. - #[cfg(feature = "sinks-gcp")] - GcpChronicleUnstructured(gcp::chronicle_unstructured::ChronicleUnstructuredConfig), - - /// Deliver logs to GCP's Cloud Operations suite. - #[cfg(feature = "sinks-gcp")] - #[configurable(metadata(docs::human_name = "GCP Operations (Stackdriver)"))] - GcpStackdriverLogs(gcp::stackdriver_logs::StackdriverConfig), - - /// Deliver metrics to GCP's Cloud Monitoring system. - #[cfg(feature = "sinks-gcp")] - #[configurable(metadata(docs::human_name = "GCP Cloud Monitoring (Stackdriver)"))] - GcpStackdriverMetrics(gcp::stackdriver_metrics::StackdriverConfig), - - /// Store observability events in GCP Cloud Storage. - #[cfg(feature = "sinks-gcp")] - GcpCloudStorage(gcp::cloud_storage::GcsSinkConfig), - - /// Publish observability events to GCP's Pub/Sub messaging system. - #[cfg(feature = "sinks-gcp")] - GcpPubsub(gcp::pubsub::PubsubConfig), - - /// WebHDFS. - #[cfg(feature = "sinks-webhdfs")] - Webhdfs(webhdfs::WebHdfsConfig), - - /// Deliver log events to Honeycomb. - #[cfg(feature = "sinks-honeycomb")] - Honeycomb(honeycomb::HoneycombConfig), - - /// Deliver observability event data to an HTTP server. - #[cfg(feature = "sinks-http")] - Http(http::HttpSinkConfig), - - /// Deliver log event data to Humio. - #[cfg(feature = "sinks-humio")] - HumioLogs(humio::logs::HumioLogsConfig), - - /// Deliver metric event data to Humio. - #[cfg(feature = "sinks-humio")] - HumioMetrics(humio::metrics::HumioMetricsConfig), - - /// Deliver log event data to InfluxDB. - #[cfg(any(feature = "sinks-influxdb", feature = "prometheus-integration-tests"))] - InfluxdbLogs(influxdb::logs::InfluxDbLogsConfig), - - /// Deliver metric event data to InfluxDB. - #[cfg(any(feature = "sinks-influxdb", feature = "prometheus-integration-tests"))] - InfluxdbMetrics(influxdb::metrics::InfluxDbConfig), - - /// Publish observability event data to Apache Kafka topics. - #[cfg(feature = "sinks-kafka")] - Kafka(kafka::KafkaSinkConfig), - - /// Deliver log event data to Mezmo. - #[cfg(feature = "sinks-mezmo")] - Mezmo(mezmo::MezmoConfig), - - /// Deliver log event data to LogDNA. - #[cfg(feature = "sinks-mezmo")] - Logdna(mezmo::LogdnaConfig), - - /// Deliver log event data to the Loki aggregation system. - #[cfg(feature = "sinks-loki")] - Loki(loki::LokiConfig), - - /// Publish observability data to subjects on the NATS messaging system. - #[cfg(feature = "sinks-nats")] - Nats(self::nats::NatsSinkConfig), - - /// Deliver events to New Relic. - #[cfg(feature = "sinks-new_relic")] - NewRelic(new_relic::NewRelicConfig), - - /// Deliver log events to Papertrail from SolarWinds. - #[cfg(feature = "sinks-papertrail")] - Papertrail(papertrail::PapertrailConfig), - - /// Expose metric events on a Prometheus compatible endpoint. - #[cfg(feature = "sinks-prometheus")] - PrometheusExporter(prometheus::exporter::PrometheusExporterConfig), - - /// Deliver metric data to a Prometheus remote write endpoint. - #[cfg(feature = "sinks-prometheus")] - PrometheusRemoteWrite(prometheus::remote_write::RemoteWriteConfig), - - /// Publish observability events to Apache Pulsar topics. - #[cfg(feature = "sinks-pulsar")] - Pulsar(pulsar::config::PulsarSinkConfig), - - /// Publish observability data to Redis. - #[cfg(feature = "sinks-redis")] - Redis(redis::RedisSinkConfig), - - /// Publish log events to Sematext. - #[cfg(feature = "sinks-sematext")] - SematextLogs(sematext::logs::SematextLogsConfig), - - /// Publish metric events to Sematext. - #[cfg(feature = "sinks-sematext")] - SematextMetrics(sematext::metrics::SematextMetricsConfig), - - /// Deliver logs to a remote socket endpoint. - #[cfg(feature = "sinks-socket")] - Socket(socket::SocketSinkConfig), - - /// Deliver log data to Splunk's HTTP Event Collector. - #[cfg(feature = "sinks-splunk_hec")] - SplunkHecLogs(splunk_hec::logs::config::HecLogsSinkConfig), - - /// Deliver metric data to Splunk's HTTP Event Collector. - #[cfg(feature = "sinks-splunk_hec")] - SplunkHecMetrics(splunk_hec::metrics::config::HecMetricsSinkConfig), - - /// Deliver metric data to a StatsD aggregator. - #[cfg(feature = "sinks-statsd")] - Statsd(statsd::StatsdSinkConfig), - - /// Test (adaptive concurrency). - #[cfg(all(test, feature = "sources-demo_logs"))] - TestArc(self::util::adaptive_concurrency::tests::TestConfig), - - /// Test (backpressure). - #[cfg(test)] - TestBackpressure(crate::test_util::mock::sinks::BackpressureSinkConfig), - - /// Test (basic). - #[cfg(test)] - TestBasic(crate::test_util::mock::sinks::BasicSinkConfig), - - /// Test (error). - #[cfg(test)] - TestError(crate::test_util::mock::sinks::ErrorSinkConfig), - - /// Test (oneshot). - #[cfg(test)] - TestOneshot(crate::test_util::mock::sinks::OneshotSinkConfig), - - /// Test (panic). - #[cfg(test)] - TestPanic(crate::test_util::mock::sinks::PanicSinkConfig), - - /// Unit test. - UnitTest(UnitTestSinkConfig), - - /// Unit test stream. - UnitTestStream(UnitTestStreamSinkConfig), - - /// Relay observability data to a Vector instance. - #[cfg(feature = "sinks-vector")] - Vector(vector::VectorConfig), - - /// Deliver observability event data to a websocket listener. - #[cfg(feature = "sinks-websocket")] - Websocket(websocket::WebSocketSinkConfig), -} - -impl NamedComponent for Sinks { - fn get_component_name(&self) -> &'static str { - match self { - #[cfg(feature = "sinks-amqp")] - Self::Amqp(config) => config.get_component_name(), - #[cfg(feature = "sinks-appsignal")] - Self::Appsignal(config) => config.get_component_name(), - #[cfg(feature = "sinks-aws_cloudwatch_logs")] - Self::AwsCloudwatchLogs(config) => config.get_component_name(), - #[cfg(feature = "sinks-aws_cloudwatch_metrics")] - Self::AwsCloudwatchMetrics(config) => config.get_component_name(), - #[cfg(feature = "sinks-aws_kinesis_firehose")] - Self::AwsKinesisFirehose(config) => config.get_component_name(), - #[cfg(feature = "sinks-aws_kinesis_streams")] - Self::AwsKinesisStreams(config) => config.get_component_name(), - #[cfg(feature = "sinks-aws_s3")] - Self::AwsS3(config) => config.get_component_name(), - #[cfg(feature = "sinks-aws_sqs")] - Self::AwsSqs(config) => config.get_component_name(), - #[cfg(feature = "sinks-axiom")] - Self::Axiom(config) => config.get_component_name(), - #[cfg(feature = "sinks-azure_blob")] - Self::AzureBlob(config) => config.get_component_name(), - #[cfg(feature = "sinks-azure_monitor_logs")] - Self::AzureMonitorLogs(config) => config.get_component_name(), - #[cfg(feature = "sinks-blackhole")] - Self::Blackhole(config) => config.get_component_name(), - #[cfg(feature = "sinks-clickhouse")] - Self::Clickhouse(config) => config.get_component_name(), - #[cfg(feature = "sinks-console")] - Self::Console(config) => config.get_component_name(), - #[cfg(feature = "sinks-databend")] - Self::Databend(config) => config.get_component_name(), - #[cfg(feature = "sinks-datadog_archives")] - Self::DatadogArchives(config) => config.get_component_name(), - #[cfg(feature = "sinks-datadog_events")] - Self::DatadogEvents(config) => config.get_component_name(), - #[cfg(feature = "sinks-datadog_logs")] - Self::DatadogLogs(config) => config.get_component_name(), - #[cfg(feature = "sinks-datadog_metrics")] - Self::DatadogMetrics(config) => config.get_component_name(), - #[cfg(feature = "sinks-datadog_traces")] - Self::DatadogTraces(config) => config.get_component_name(), - #[cfg(feature = "sinks-elasticsearch")] - Self::Elasticsearch(config) => config.get_component_name(), - #[cfg(feature = "sinks-file")] - Self::File(config) => config.get_component_name(), - #[cfg(feature = "sinks-gcp")] - Self::GcpChronicleUnstructured(config) => config.get_component_name(), - #[cfg(feature = "sinks-gcp")] - Self::GcpStackdriverLogs(config) => config.get_component_name(), - #[cfg(feature = "sinks-gcp")] - Self::GcpStackdriverMetrics(config) => config.get_component_name(), - #[cfg(feature = "sinks-gcp")] - Self::GcpCloudStorage(config) => config.get_component_name(), - #[cfg(feature = "sinks-gcp")] - Self::GcpPubsub(config) => config.get_component_name(), - #[cfg(feature = "sinks-webhdfs")] - Self::Webhdfs(config) => config.get_component_name(), - #[cfg(feature = "sinks-honeycomb")] - Self::Honeycomb(config) => config.get_component_name(), - #[cfg(feature = "sinks-http")] - Self::Http(config) => config.get_component_name(), - #[cfg(feature = "sinks-humio")] - Self::HumioLogs(config) => config.get_component_name(), - #[cfg(feature = "sinks-humio")] - Self::HumioMetrics(config) => config.get_component_name(), - #[cfg(any(feature = "sinks-influxdb", feature = "prometheus-integration-tests"))] - Self::InfluxdbLogs(config) => config.get_component_name(), - #[cfg(any(feature = "sinks-influxdb", feature = "prometheus-integration-tests"))] - Self::InfluxdbMetrics(config) => config.get_component_name(), - #[cfg(feature = "sinks-kafka")] - Self::Kafka(config) => config.get_component_name(), - #[cfg(feature = "sinks-mezmo")] - Self::Mezmo(config) => config.get_component_name(), - #[cfg(feature = "sinks-mezmo")] - Self::Logdna(config) => config.get_component_name(), - #[cfg(feature = "sinks-loki")] - Self::Loki(config) => config.get_component_name(), - #[cfg(feature = "sinks-nats")] - Self::Nats(config) => config.get_component_name(), - #[cfg(feature = "sinks-new_relic")] - Self::NewRelic(config) => config.get_component_name(), - #[cfg(feature = "sinks-papertrail")] - Self::Papertrail(config) => config.get_component_name(), - #[cfg(feature = "sinks-prometheus")] - Self::PrometheusExporter(config) => config.get_component_name(), - #[cfg(feature = "sinks-prometheus")] - Self::PrometheusRemoteWrite(config) => config.get_component_name(), - #[cfg(feature = "sinks-pulsar")] - Self::Pulsar(config) => config.get_component_name(), - #[cfg(feature = "sinks-redis")] - Self::Redis(config) => config.get_component_name(), - #[cfg(feature = "sinks-sematext")] - Self::SematextLogs(config) => config.get_component_name(), - #[cfg(feature = "sinks-sematext")] - Self::SematextMetrics(config) => config.get_component_name(), - #[cfg(feature = "sinks-socket")] - Self::Socket(config) => config.get_component_name(), - #[cfg(feature = "sinks-splunk_hec")] - Self::SplunkHecLogs(config) => config.get_component_name(), - #[cfg(feature = "sinks-splunk_hec")] - Self::SplunkHecMetrics(config) => config.get_component_name(), - #[cfg(feature = "sinks-statsd")] - Self::Statsd(config) => config.get_component_name(), - #[cfg(all(test, feature = "sources-demo_logs"))] - Self::TestArc(config) => config.get_component_name(), - #[cfg(test)] - Self::TestBackpressure(config) => config.get_component_name(), - #[cfg(test)] - Self::TestBasic(config) => config.get_component_name(), - #[cfg(test)] - Self::TestError(config) => config.get_component_name(), - #[cfg(test)] - Self::TestOneshot(config) => config.get_component_name(), - #[cfg(test)] - Self::TestPanic(config) => config.get_component_name(), - Self::UnitTest(config) => config.get_component_name(), - Self::UnitTestStream(config) => config.get_component_name(), - #[cfg(feature = "sinks-vector")] - Self::Vector(config) => config.get_component_name(), - #[cfg(feature = "sinks-websocket")] - Self::Websocket(config) => config.get_component_name(), - } - } -} diff --git a/src/sinks/nats.rs b/src/sinks/nats.rs index 37295fa96e100..e80f28245a631 100644 --- a/src/sinks/nats.rs +++ b/src/sinks/nats.rs @@ -41,7 +41,10 @@ enum BuildError { */ /// Configuration for the `nats` sink. -#[configurable_component(sink("nats"))] +#[configurable_component(sink( + "nats", + "Publish observability data to subjects on the NATS messaging system." +))] #[derive(Clone, Debug)] #[serde(deny_unknown_fields)] pub struct NatsSinkConfig { @@ -114,6 +117,7 @@ impl GenerateConfig for NatsSinkConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "nats")] impl SinkConfig for NatsSinkConfig { async fn build( &self, diff --git a/src/sinks/new_relic/config.rs b/src/sinks/new_relic/config.rs index 9399c80383b09..5900755b12207 100644 --- a/src/sinks/new_relic/config.rs +++ b/src/sinks/new_relic/config.rs @@ -75,7 +75,7 @@ impl RetryLogic for NewRelicApiRetry { } /// Configuration for the `new_relic` sink. -#[configurable_component(sink("new_relic"))] +#[configurable_component(sink("new_relic", "Deliver events to New Relic."))] #[derive(Clone, Debug, Default)] #[serde(deny_unknown_fields)] pub struct NewRelicConfig { @@ -139,6 +139,7 @@ impl NewRelicConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "new_relic")] impl SinkConfig for NewRelicConfig { async fn build( &self, diff --git a/src/sinks/papertrail.rs b/src/sinks/papertrail.rs index 7dbd82459e422..f3d3afb55ace0 100644 --- a/src/sinks/papertrail.rs +++ b/src/sinks/papertrail.rs @@ -16,7 +16,7 @@ use crate::{ }; /// Configuration for the `papertrail` sink. -#[configurable_component(sink("papertrail"))] +#[configurable_component(sink("papertrail", "Deliver log events to Papertrail from SolarWinds."))] #[derive(Clone, Debug)] #[serde(deny_unknown_fields)] pub struct PapertrailConfig { @@ -65,6 +65,7 @@ impl GenerateConfig for PapertrailConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "papertrail")] impl SinkConfig for PapertrailConfig { async fn build( &self, diff --git a/src/sinks/prometheus/exporter.rs b/src/sinks/prometheus/exporter.rs index 98bc9a504c014..bb7e6c775b629 100644 --- a/src/sinks/prometheus/exporter.rs +++ b/src/sinks/prometheus/exporter.rs @@ -61,7 +61,10 @@ enum BuildError { /// Configuration for the `prometheus_exporter` sink. #[serde_as] -#[configurable_component(sink("prometheus_exporter"))] +#[configurable_component(sink( + "prometheus_exporter", + "Expose metric events on a Prometheus compatible endpoint." +))] #[derive(Clone, Debug)] #[serde(deny_unknown_fields)] pub struct PrometheusExporterConfig { @@ -189,6 +192,7 @@ impl GenerateConfig for PrometheusExporterConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "prometheus_exporter")] impl SinkConfig for PrometheusExporterConfig { async fn build(&self, _cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { if self.flush_period_secs.as_secs() < MIN_FLUSH_PERIOD_SECS { diff --git a/src/sinks/prometheus/remote_write.rs b/src/sinks/prometheus/remote_write.rs index 6451e591f11e0..28c043080bc0a 100644 --- a/src/sinks/prometheus/remote_write.rs +++ b/src/sinks/prometheus/remote_write.rs @@ -53,7 +53,10 @@ enum Errors { } /// Configuration for the `prometheus_remote_write` sink. -#[configurable_component(sink("prometheus_remote_write"))] +#[configurable_component(sink( + "prometheus_remote_write", + "Deliver metric data to a Prometheus remote write endpoint." +))] #[derive(Clone, Debug, Default)] #[serde(deny_unknown_fields)] pub struct RemoteWriteConfig { @@ -159,6 +162,7 @@ const fn convert_compression_to_content_encoding(compression: Compression) -> &' } #[async_trait::async_trait] +#[typetag::serde(name = "prometheus_remote_write")] impl SinkConfig for RemoteWriteConfig { async fn build( &self, diff --git a/src/sinks/pulsar/config.rs b/src/sinks/pulsar/config.rs index 7ec5ef601f32e..ab53a350f32b5 100644 --- a/src/sinks/pulsar/config.rs +++ b/src/sinks/pulsar/config.rs @@ -22,7 +22,7 @@ use vector_core::config::DataType; use vrl::value::Kind; /// Configuration for the `pulsar` sink. -#[configurable_component(sink("pulsar"))] +#[configurable_component(sink("pulsar", "Publish observability events to Apache Pulsar topics."))] #[derive(Clone, Debug)] pub struct PulsarSinkConfig { /// The endpoint to which the Pulsar client should connect to. @@ -281,6 +281,7 @@ impl GenerateConfig for PulsarSinkConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "pulsar")] impl SinkConfig for PulsarSinkConfig { async fn build(&self, _cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let client = self diff --git a/src/sinks/redis.rs b/src/sinks/redis.rs index 5a53831bebd3c..402ad28aee906 100644 --- a/src/sinks/redis.rs +++ b/src/sinks/redis.rs @@ -109,7 +109,7 @@ impl SinkBatchSettings for RedisDefaultBatchSettings { } /// Configuration for the `redis` sink. -#[configurable_component(sink("redis"))] +#[configurable_component(sink("redis", "Publish observability data to Redis."))] #[derive(Clone, Debug)] #[serde(deny_unknown_fields)] pub struct RedisSinkConfig { @@ -171,6 +171,7 @@ impl GenerateConfig for RedisSinkConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "redis")] impl SinkConfig for RedisSinkConfig { async fn build( &self, diff --git a/src/sinks/sematext/logs.rs b/src/sinks/sematext/logs.rs index a5dcb0da9434c..e4a3d05b00452 100644 --- a/src/sinks/sematext/logs.rs +++ b/src/sinks/sematext/logs.rs @@ -21,7 +21,7 @@ use crate::{ }; /// Configuration for the `sematext_logs` sink. -#[configurable_component(sink("sematext_logs"))] +#[configurable_component(sink("sematext_logs", "Publish log events to Sematext."))] #[derive(Clone, Debug)] pub struct SematextLogsConfig { #[serde(default = "super::default_region")] @@ -79,6 +79,7 @@ const US_ENDPOINT: &str = "https://logsene-receiver.sematext.com"; const EU_ENDPOINT: &str = "https://logsene-receiver.eu.sematext.com"; #[async_trait::async_trait] +#[typetag::serde(name = "sematext_logs")] impl SinkConfig for SematextLogsConfig { async fn build(&self, cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let endpoint = match (&self.endpoint, &self.region) { diff --git a/src/sinks/sematext/metrics.rs b/src/sinks/sematext/metrics.rs index 29a51c9309638..3e09630d556f6 100644 --- a/src/sinks/sematext/metrics.rs +++ b/src/sinks/sematext/metrics.rs @@ -47,7 +47,7 @@ impl SinkBatchSettings for SematextMetricsDefaultBatchSettings { } /// Configuration for the `sematext_metrics` sink. -#[configurable_component(sink("sematext_metrics"))] +#[configurable_component(sink("sematext_metrics", "Publish metric events to Sematext."))] #[derive(Clone, Debug)] pub struct SematextMetricsConfig { /// Sets the default namespace for any metrics sent. @@ -121,6 +121,7 @@ const US_ENDPOINT: &str = "https://spm-receiver.sematext.com"; const EU_ENDPOINT: &str = "https://spm-receiver.eu.sematext.com"; #[async_trait::async_trait] +#[typetag::serde(name = "sematext_metrics")] impl SinkConfig for SematextMetricsConfig { async fn build(&self, cx: SinkContext) -> Result<(VectorSink, Healthcheck)> { let client = HttpClient::new(None, cx.proxy())?; diff --git a/src/sinks/socket.rs b/src/sinks/socket.rs index 1919ba4b2fa9f..f22339497b47e 100644 --- a/src/sinks/socket.rs +++ b/src/sinks/socket.rs @@ -13,7 +13,7 @@ use crate::{ }; /// Configuration for the `socket` sink. -#[configurable_component(sink("socket"))] +#[configurable_component(sink("socket", "Deliver logs to a remote socket endpoint."))] #[derive(Clone, Debug)] pub struct SocketSinkConfig { #[serde(flatten)] @@ -113,6 +113,7 @@ impl SocketSinkConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "socket")] impl SinkConfig for SocketSinkConfig { async fn build( &self, diff --git a/src/sinks/splunk_hec/logs/config.rs b/src/sinks/splunk_hec/logs/config.rs index 1e0c6675db193..64299669e388b 100644 --- a/src/sinks/splunk_hec/logs/config.rs +++ b/src/sinks/splunk_hec/logs/config.rs @@ -31,7 +31,10 @@ use crate::{ }; /// Configuration for the `splunk_hec_logs` sink. -#[configurable_component(sink("splunk_hec_logs"))] +#[configurable_component(sink( + "splunk_hec_logs", + "Deliver log data to Splunk's HTTP Event Collector." +))] #[derive(Clone, Debug)] #[serde(deny_unknown_fields)] pub struct HecLogsSinkConfig { @@ -183,6 +186,7 @@ impl GenerateConfig for HecLogsSinkConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "splunk_hec_logs")] impl SinkConfig for HecLogsSinkConfig { async fn build(&self, cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { if self.auto_extract_timestamp.is_some() && self.endpoint_target == EndpointTarget::Raw { diff --git a/src/sinks/splunk_hec/metrics/config.rs b/src/sinks/splunk_hec/metrics/config.rs index c989beb4977e4..c93519352868e 100644 --- a/src/sinks/splunk_hec/metrics/config.rs +++ b/src/sinks/splunk_hec/metrics/config.rs @@ -27,7 +27,10 @@ use crate::{ }; /// Configuration of the `splunk_hec_metrics` sink. -#[configurable_component(sink("splunk_hec_metrics"))] +#[configurable_component(sink( + "splunk_hec_metrics", + "Deliver metric data to Splunk's HTTP Event Collector." +))] #[derive(Clone, Debug)] #[serde(deny_unknown_fields)] pub struct HecMetricsSinkConfig { @@ -138,6 +141,7 @@ impl GenerateConfig for HecMetricsSinkConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "splunk_hec_metrics")] impl SinkConfig for HecMetricsSinkConfig { async fn build(&self, cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let client = create_client(&self.tls, cx.proxy())?; diff --git a/src/sinks/statsd/config.rs b/src/sinks/statsd/config.rs index 5e1052d59a8bd..340daa247c4dc 100644 --- a/src/sinks/statsd/config.rs +++ b/src/sinks/statsd/config.rs @@ -35,7 +35,7 @@ impl SinkBatchSettings for StatsdDefaultBatchSettings { } /// Configuration for the `statsd` sink. -#[configurable_component(sink("statsd"))] +#[configurable_component(sink("statsd", "Deliver metric data to a StatsD aggregator."))] #[derive(Clone, Debug)] pub struct StatsdSinkConfig { /// Sets the default namespace for any metrics sent. @@ -121,6 +121,7 @@ impl GenerateConfig for StatsdSinkConfig { } #[async_trait] +#[typetag::serde(name = "statsd")] impl SinkConfig for StatsdSinkConfig { async fn build(&self, _cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let batcher_settings = self.batch.into_batcher_settings()?; diff --git a/src/sinks/util/adaptive_concurrency/tests.rs b/src/sinks/util/adaptive_concurrency/tests.rs index 69c52bc6ca236..9c2cd0272215a 100644 --- a/src/sinks/util/adaptive_concurrency/tests.rs +++ b/src/sinks/util/adaptive_concurrency/tests.rs @@ -147,7 +147,7 @@ const fn default_concurrency() -> Concurrency { } /// Configuration for the `test_arc` sink. -#[configurable_component(sink("test_arc"))] +#[configurable_component(sink("test_arc", "Test (adaptive concurrency)."))] #[derive(Clone, Debug, Default)] pub struct TestConfig { #[configurable(derived)] @@ -170,6 +170,7 @@ pub struct TestConfig { impl_generate_config_from_default!(TestConfig); #[async_trait::async_trait] +#[typetag::serde(name = "test_arc")] impl SinkConfig for TestConfig { async fn build(&self, _cx: SinkContext) -> Result<(VectorSink, Healthcheck), crate::Error> { let mut batch_settings = BatchSettings::default(); diff --git a/src/sinks/vector/config.rs b/src/sinks/vector/config.rs index 7c2ebfea410c9..74450c117df01 100644 --- a/src/sinks/vector/config.rs +++ b/src/sinks/vector/config.rs @@ -28,7 +28,7 @@ use crate::{ }; /// Configuration for the `vector` sink. -#[configurable_component(sink("vector"))] +#[configurable_component(sink("vector", "Relay observability data to a Vector instance."))] #[derive(Clone, Debug)] #[serde(deny_unknown_fields)] pub struct VectorConfig { @@ -105,6 +105,7 @@ fn default_config(address: &str) -> VectorConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "vector")] impl SinkConfig for VectorConfig { async fn build(&self, cx: SinkContext) -> crate::Result<(VectorSinkType, Healthcheck)> { let tls = MaybeTlsSettings::from_config(&self.tls, false)?; diff --git a/src/sinks/webhdfs/config.rs b/src/sinks/webhdfs/config.rs index 86518a8692f64..05e4df4cbf901 100644 --- a/src/sinks/webhdfs/config.rs +++ b/src/sinks/webhdfs/config.rs @@ -21,7 +21,7 @@ use crate::{ }; /// Configuration for the `webhdfs` sink. -#[configurable_component(sink("webhdfs"))] +#[configurable_component(sink("webhdfs", "WebHDFS."))] #[derive(Clone, Debug)] #[serde(deny_unknown_fields)] pub struct WebHdfsConfig { @@ -97,6 +97,7 @@ impl GenerateConfig for WebHdfsConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "webhdfs")] impl SinkConfig for WebHdfsConfig { async fn build(&self, _cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let op = self.build_operator()?; diff --git a/src/sinks/websocket/config.rs b/src/sinks/websocket/config.rs index 64f6087079902..6027273ee4275 100644 --- a/src/sinks/websocket/config.rs +++ b/src/sinks/websocket/config.rs @@ -16,7 +16,10 @@ use crate::{ }; /// Configuration for the `websocket` sink. -#[configurable_component(sink("websocket"))] +#[configurable_component(sink( + "websocket", + "Deliver observability event data to a websocket listener." +))] #[derive(Clone, Debug)] pub struct WebSocketSinkConfig { /// The WebSocket URI to connect to. @@ -78,6 +81,7 @@ impl GenerateConfig for WebSocketSinkConfig { } #[async_trait::async_trait] +#[typetag::serde(name = "websocket")] impl SinkConfig for WebSocketSinkConfig { async fn build(&self, _cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let connector = self.build_connector()?; diff --git a/src/test_util/mock/sinks/backpressure.rs b/src/test_util/mock/sinks/backpressure.rs index f84b5c6f3f07c..1c3974a71e168 100644 --- a/src/test_util/mock/sinks/backpressure.rs +++ b/src/test_util/mock/sinks/backpressure.rs @@ -23,7 +23,7 @@ impl StreamSink for BackpressureSink { } /// Configuration for the `test_backpressure` sink. -#[configurable_component(sink("test_backpressure"))] +#[configurable_component(sink("test_backpressure", "Test (backpressure)."))] #[derive(Clone, Debug, Default)] pub struct BackpressureSinkConfig { /// Number of events to consume before stopping. @@ -33,6 +33,7 @@ pub struct BackpressureSinkConfig { impl_generate_config_from_default!(BackpressureSinkConfig); #[async_trait] +#[typetag::serde(name = "test_backpressure")] impl SinkConfig for BackpressureSinkConfig { async fn build(&self, _cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { let sink = BackpressureSink { diff --git a/src/test_util/mock/sinks/basic.rs b/src/test_util/mock/sinks/basic.rs index 0182b56d77bf0..a7463aace4f14 100644 --- a/src/test_util/mock/sinks/basic.rs +++ b/src/test_util/mock/sinks/basic.rs @@ -17,7 +17,7 @@ use crate::{ }; /// Configuration for the `test_basic` sink. -#[configurable_component(sink("test_basic"))] +#[configurable_component(sink("test_basic", "Test (basic)."))] #[derive(Clone, Debug, Default)] pub struct BasicSinkConfig { #[serde(skip)] @@ -65,6 +65,7 @@ enum HealthcheckError { } #[async_trait] +#[typetag::serde(name = "test_basic")] impl SinkConfig for BasicSinkConfig { async fn build(&self, _cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { // If this sink is set to not be healthy, just send the healthcheck error immediately over diff --git a/src/test_util/mock/sinks/error.rs b/src/test_util/mock/sinks/error.rs index b1a662fa6694f..bb6c7d6a9e323 100644 --- a/src/test_util/mock/sinks/error.rs +++ b/src/test_util/mock/sinks/error.rs @@ -18,7 +18,7 @@ use crate::{ }; /// Configuration for the `test_error` sink. -#[configurable_component(sink("test_error"))] +#[configurable_component(sink("test_error", "Test (error)."))] #[derive(Clone, Debug, Default)] pub struct ErrorSinkConfig { /// Dummy field used for generating unique configurations to trigger reloads. @@ -28,6 +28,7 @@ pub struct ErrorSinkConfig { impl_generate_config_from_default!(ErrorSinkConfig); #[async_trait] +#[typetag::serde(name = "test_error")] impl SinkConfig for ErrorSinkConfig { async fn build(&self, _cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { #[allow(deprecated)] diff --git a/src/test_util/mock/sinks/oneshot.rs b/src/test_util/mock/sinks/oneshot.rs index 084efdb107e83..3ebc5a27e4b9e 100644 --- a/src/test_util/mock/sinks/oneshot.rs +++ b/src/test_util/mock/sinks/oneshot.rs @@ -16,7 +16,7 @@ use crate::{ }; /// Configurable for the `test_oneshot` sink. -#[configurable_component(sink("test_oneshot"))] +#[configurable_component(sink("test_oneshot", "Test (oneshot)."))] #[derive(Clone, Debug, Default)] pub struct OneshotSinkConfig { #[serde(skip)] @@ -34,6 +34,7 @@ impl OneshotSinkConfig { } #[async_trait] +#[typetag::serde(name = "test_oneshot")] impl SinkConfig for OneshotSinkConfig { fn input(&self) -> Input { Input::all() diff --git a/src/test_util/mock/sinks/panic.rs b/src/test_util/mock/sinks/panic.rs index 34079fc30f4ec..22f56157679ed 100644 --- a/src/test_util/mock/sinks/panic.rs +++ b/src/test_util/mock/sinks/panic.rs @@ -18,7 +18,7 @@ use crate::{ }; /// Configuration for the `test_panic` sink. -#[configurable_component(sink("test_panic"))] +#[configurable_component(sink("test_panic", "Test (panic)."))] #[derive(Clone, Debug, Default)] pub struct PanicSinkConfig { /// Dummy field used for generating unique configurations to trigger reloads. @@ -28,6 +28,7 @@ pub struct PanicSinkConfig { impl_generate_config_from_default!(PanicSinkConfig); #[async_trait] +#[typetag::serde(name = "test_panic")] impl SinkConfig for PanicSinkConfig { async fn build(&self, _cx: SinkContext) -> crate::Result<(VectorSink, Healthcheck)> { #[allow(deprecated)] diff --git a/src/topology/builder.rs b/src/topology/builder.rs index a02dddd13f3d3..ba0d2dda8a761 100644 --- a/src/topology/builder.rs +++ b/src/topology/builder.rs @@ -19,7 +19,6 @@ use tracing::Instrument; use vector_common::internal_event::{ self, CountByteSize, EventsSent, InternalEventHandle as _, Registered, }; -use vector_config::NamedComponent; use vector_core::config::LogNamespace; use vector_core::{ buffers::{ @@ -42,7 +41,7 @@ use super::{ use crate::{ config::{ ComponentKey, DataType, EnrichmentTableConfig, Input, Inputs, OutputId, ProxyConfig, - SinkConfig, SinkContext, SourceContext, TransformContext, TransformOuter, TransformOutput, + SinkContext, SourceContext, TransformContext, TransformOuter, TransformOutput, }, event::{EventArray, EventContainer}, internal_events::EventsReceived, diff --git a/src/topology/schema.rs b/src/topology/schema.rs index b0256a22178b0..bd0974a5adeaf 100644 --- a/src/topology/schema.rs +++ b/src/topology/schema.rs @@ -6,7 +6,7 @@ use vector_core::config::SourceOutput; pub(super) use crate::schema::Definition; use crate::{ - config::{ComponentKey, Config, OutputId, SinkConfig, SinkOuter, TransformOutput}, + config::{ComponentKey, Config, OutputId, SinkOuter, TransformOutput}, topology, }; From a92323a21739af4fc2e776c14d71d5ef379c5be8 Mon Sep 17 00:00:00 2001 From: Bruce Guenter Date: Mon, 19 Jun 2023 15:29:28 -0600 Subject: [PATCH 2/4] Fix `make test` --- src/api/schema/components/mod.rs | 1 - src/sinks/datadog/logs/mod.rs | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/api/schema/components/mod.rs b/src/api/schema/components/mod.rs index 6f096034ad87a..20880f3a06698 100644 --- a/src/api/schema/components/mod.rs +++ b/src/api/schema/components/mod.rs @@ -11,7 +11,6 @@ use std::{ use async_graphql::{Enum, InputObject, Interface, Object, Subscription}; use once_cell::sync::Lazy; use tokio_stream::{wrappers::BroadcastStream, Stream, StreamExt}; -use vector_config::NamedComponent; use vector_core::internal_event::DEFAULT_OUTPUT; use crate::{ diff --git a/src/sinks/datadog/logs/mod.rs b/src/sinks/datadog/logs/mod.rs index b20a00201a7a1..0f99ee8dc8947 100644 --- a/src/sinks/datadog/logs/mod.rs +++ b/src/sinks/datadog/logs/mod.rs @@ -27,3 +27,5 @@ mod tests; mod config; mod service; mod sink; + +pub use self::config::DatadogLogsConfig; From 84a23ba67cb507dcaf61deac459282104123c1b0 Mon Sep 17 00:00:00 2001 From: Bruce Guenter Date: Tue, 20 Jun 2023 09:36:13 -0600 Subject: [PATCH 3/4] Generate component docs --- website/cue/reference/components/sinks/base/aws_s3.cue | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/website/cue/reference/components/sinks/base/aws_s3.cue b/website/cue/reference/components/sinks/base/aws_s3.cue index a7fa8c1eb2216..11265897c80fc 100644 --- a/website/cue/reference/components/sinks/base/aws_s3.cue +++ b/website/cue/reference/components/sinks/base/aws_s3.cue @@ -727,8 +727,12 @@ base: components: sinks: aws_s3: configuration: { } } server_side_encryption: { - description: "The Server-side Encryption algorithm used when storing these objects." - required: false + description: """ + AWS S3 Server-Side Encryption algorithms. + + The Server-side Encryption algorithm used when storing these objects. + """ + required: false type: string: enum: { AES256: """ Each object is encrypted with AES-256 using a unique key. From 392ca6a651e7bab983465f1ef4ccd29bccc25c32 Mon Sep 17 00:00:00 2001 From: Bruce Guenter Date: Tue, 20 Jun 2023 11:18:30 -0600 Subject: [PATCH 4/4] Tweak description of `datadog_traces` sink --- src/sinks/datadog/traces/config.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sinks/datadog/traces/config.rs b/src/sinks/datadog/traces/config.rs index 7bafd0549f323..bb8f4d183d63d 100644 --- a/src/sinks/datadog/traces/config.rs +++ b/src/sinks/datadog/traces/config.rs @@ -54,7 +54,7 @@ impl SinkBatchSettings for DatadogTracesDefaultBatchSettings { } /// Configuration for the `datadog_traces` sink. -#[configurable_component(sink("datadog_traces", "Publish traces to Datadog."))] +#[configurable_component(sink("datadog_traces", "Publish trace events to Datadog."))] #[derive(Clone, Debug, Default)] #[serde(deny_unknown_fields)] pub struct DatadogTracesConfig {