11use std:: sync:: Arc ;
22
3+ use codecs:: { encoding:: SerializerConfig , JsonSerializerConfig , TextSerializerConfig } ;
34use futures_util:: FutureExt ;
45use serde:: { Deserialize , Serialize } ;
56use tower:: ServiceBuilder ;
67use vector_core:: sink:: VectorSink ;
78
89use super :: { encoder:: HecLogsEncoder , request_builder:: HecLogsRequestBuilder , sink:: HecLogsSink } ;
910use crate :: {
11+ codecs:: Encoder ,
1012 config:: { AcknowledgementsConfig , GenerateConfig , Input , SinkConfig , SinkContext } ,
1113 http:: HttpClient ,
1214 sinks:: {
@@ -17,15 +19,37 @@ use crate::{
1719 timestamp_key, SplunkHecDefaultBatchSettings ,
1820 } ,
1921 util:: {
20- encoding:: EncodingConfig , http:: HttpRetryLogic , BatchConfig , Compression ,
21- ServiceBuilderExt , TowerRequestConfig ,
22+ encoding:: { EncodingConfig , EncodingConfigAdapter , EncodingConfigMigrator } ,
23+ http:: HttpRetryLogic ,
24+ BatchConfig , Compression , ServiceBuilderExt , TowerRequestConfig ,
2225 } ,
2326 Healthcheck ,
2427 } ,
2528 template:: Template ,
2629 tls:: TlsConfig ,
2730} ;
2831
32+ #[ derive( Debug , Clone , Eq , PartialEq , Serialize , Deserialize ) ]
33+ #[ serde( rename_all = "snake_case" ) ]
34+ pub enum HecEncoding {
35+ Json ,
36+ Text ,
37+ }
38+
39+ #[ derive( Debug , Clone , Serialize , Deserialize ) ]
40+ pub struct HecEncodingMigrator ;
41+
42+ impl EncodingConfigMigrator for HecEncodingMigrator {
43+ type Codec = HecEncoding ;
44+
45+ fn migrate ( codec : & Self :: Codec ) -> SerializerConfig {
46+ match codec {
47+ HecEncoding :: Text => TextSerializerConfig :: new ( ) . into ( ) ,
48+ HecEncoding :: Json => JsonSerializerConfig :: new ( ) . into ( ) ,
49+ }
50+ }
51+ }
52+
2953#[ derive( Deserialize , Serialize , Debug , Clone ) ]
3054#[ serde( deny_unknown_fields) ]
3155pub struct HecLogsSinkConfig {
@@ -40,7 +64,7 @@ pub struct HecLogsSinkConfig {
4064 pub index : Option < Template > ,
4165 pub sourcetype : Option < Template > ,
4266 pub source : Option < Template > ,
43- pub encoding : EncodingConfig < HecLogsEncoder > ,
67+ pub encoding : EncodingConfigAdapter < EncodingConfig < HecEncoding > , HecEncodingMigrator > ,
4468 #[ serde( default ) ]
4569 pub compression : Compression ,
4670 #[ serde( default ) ]
@@ -66,7 +90,7 @@ impl GenerateConfig for HecLogsSinkConfig {
6690 index : None ,
6791 sourcetype : None ,
6892 source : None ,
69- encoding : HecLogsEncoder :: Text . into ( ) ,
93+ encoding : EncodingConfig :: from ( HecEncoding :: Text ) . into ( ) ,
7094 compression : Compression :: default ( ) ,
7195 batch : BatchConfig :: default ( ) ,
7296 request : TowerRequestConfig :: default ( ) ,
@@ -96,7 +120,7 @@ impl SinkConfig for HecLogsSinkConfig {
96120 }
97121
98122 fn input ( & self ) -> Input {
99- Input :: log ( )
123+ Input :: new ( self . encoding . config ( ) . input_type ( ) )
100124 }
101125
102126 fn sink_type ( & self ) -> & ' static str {
@@ -120,8 +144,15 @@ impl HecLogsSinkConfig {
120144 None
121145 } ;
122146
147+ let transformer = self . encoding . transformer ( ) ;
148+ let serializer = self . encoding . clone ( ) . encoding ( ) ;
149+ let encoder = Encoder :: < ( ) > :: new ( serializer) ;
150+ let encoder = HecLogsEncoder {
151+ transformer,
152+ encoder,
153+ } ;
123154 let request_builder = HecLogsRequestBuilder {
124- encoding : self . encoding . clone ( ) ,
155+ encoder ,
125156 compression : self . compression ,
126157 } ;
127158
@@ -167,7 +198,6 @@ impl HecLogsSinkConfig {
167198
168199// Add a compatibility alias to avoid breaking existing configs
169200#[ derive( Clone , Debug , Deserialize , Serialize ) ]
170- #[ serde( deny_unknown_fields) ]
171201struct HecSinkCompatConfig {
172202 #[ serde( flatten) ]
173203 config : HecLogsSinkConfig ,
0 commit comments