@@ -44,10 +44,16 @@ pthread_once_t initialization_guard = PTHREAD_ONCE_INIT;
44
44
45
45
FLB_TLS_DEFINE (struct flb_loki_dynamic_tenant_id_entry ,
46
46
thread_local_tenant_id );
47
+ struct flb_loki_remove_mpa_entry {
48
+ struct flb_mp_accessor * mpa ;
49
+ struct cfl_list _head ;
50
+ };
51
+ FLB_TLS_DEFINE (struct flb_loki_remove_mpa_entry , thread_local_remove_mpa );
47
52
48
53
void initialize_thread_local_storage ()
49
54
{
50
55
FLB_TLS_INIT (thread_local_tenant_id );
56
+ FLB_TLS_INIT (thread_local_remove_mpa );
51
57
}
52
58
53
59
static struct flb_loki_dynamic_tenant_id_entry * dynamic_tenant_id_create () {
@@ -81,6 +87,43 @@ static void dynamic_tenant_id_destroy(struct flb_loki_dynamic_tenant_id_entry *e
81
87
}
82
88
}
83
89
90
+ static struct flb_loki_remove_mpa_entry * remove_mpa_entry_create (struct flb_loki * ctx )
91
+ {
92
+ struct flb_loki_remove_mpa_entry * entry ;
93
+
94
+ entry = flb_calloc (1 , sizeof (struct flb_loki_remove_mpa_entry ));
95
+ if (!entry ) {
96
+ flb_errno ();
97
+ return NULL ;
98
+ }
99
+
100
+ entry -> mpa = flb_mp_accessor_create (& ctx -> remove_keys_derived );
101
+ if (!entry -> mpa ) {
102
+ flb_free (entry );
103
+ return NULL ;
104
+ }
105
+
106
+ cfl_list_entry_init (& entry -> _head );
107
+
108
+ return entry ;
109
+ }
110
+
111
+ static void remove_mpa_entry_destroy (struct flb_loki_remove_mpa_entry * entry )
112
+ {
113
+ if (entry ) {
114
+ if (entry -> mpa ) {
115
+ flb_mp_accessor_destroy (entry -> mpa );
116
+ entry -> mpa = NULL ;
117
+ }
118
+
119
+ if (!cfl_list_entry_is_orphan (& entry -> _head )) {
120
+ cfl_list_del (& entry -> _head );
121
+ }
122
+
123
+ flb_free (entry );
124
+ }
125
+ }
126
+
84
127
static void flb_loki_kv_init (struct mk_list * list )
85
128
{
86
129
mk_list_init (list );
@@ -1371,7 +1414,8 @@ static int get_tenant_id_from_record(struct flb_loki *ctx, msgpack_object *map,
1371
1414
1372
1415
static int pack_record (struct flb_loki * ctx ,
1373
1416
msgpack_packer * mp_pck , msgpack_object * rec ,
1374
- flb_sds_t * dynamic_tenant_id )
1417
+ flb_sds_t * dynamic_tenant_id ,
1418
+ struct flb_mp_accessor * remove_mpa )
1375
1419
{
1376
1420
int i ;
1377
1421
int skip = 0 ;
@@ -1397,8 +1441,8 @@ static int pack_record(struct flb_loki *ctx,
1397
1441
1398
1442
/* Remove keys in remove_keys */
1399
1443
msgpack_unpacked_init (& mp_buffer );
1400
- if (ctx -> remove_mpa ) {
1401
- ret = flb_mp_accessor_keys_remove (ctx -> remove_mpa , rec ,
1444
+ if (remove_mpa ) {
1445
+ ret = flb_mp_accessor_keys_remove (remove_mpa , rec ,
1402
1446
(void * ) & tmp_sbuf_data , & tmp_sbuf_size );
1403
1447
if (ret == FLB_TRUE ) {
1404
1448
ret = msgpack_unpack_next (& mp_buffer , tmp_sbuf_data , tmp_sbuf_size , & off );
@@ -1564,6 +1608,15 @@ static int cb_loki_init(struct flb_output_instance *ins,
1564
1608
}
1565
1609
1566
1610
cfl_list_init (& ctx -> dynamic_tenant_list );
1611
+ result = pthread_mutex_init (& ctx -> remove_mpa_list_lock , NULL );
1612
+ if (result != 0 ) {
1613
+ flb_errno ();
1614
+ flb_plg_error (ins , "cannot initialize remove_mpa list lock" );
1615
+ loki_config_destroy (ctx );
1616
+ return -1 ;
1617
+ }
1618
+
1619
+ cfl_list_init (& ctx -> remove_mpa_list );
1567
1620
1568
1621
/*
1569
1622
* This plugin instance uses the HTTP client interface, let's register
@@ -1581,7 +1634,8 @@ static flb_sds_t loki_compose_payload(struct flb_loki *ctx,
1581
1634
int total_records ,
1582
1635
char * tag , int tag_len ,
1583
1636
const void * data , size_t bytes ,
1584
- flb_sds_t * dynamic_tenant_id )
1637
+ flb_sds_t * dynamic_tenant_id ,
1638
+ struct flb_mp_accessor * remove_mpa )
1585
1639
{
1586
1640
// int mp_ok = MSGPACK_UNPACK_SUCCESS;
1587
1641
// size_t off = 0;
@@ -1672,7 +1726,7 @@ static flb_sds_t loki_compose_payload(struct flb_loki *ctx,
1672
1726
1673
1727
/* Append the timestamp */
1674
1728
pack_timestamp (& mp_pck , & log_event .timestamp );
1675
- pack_record (ctx , & mp_pck , log_event .body , dynamic_tenant_id );
1729
+ pack_record (ctx , & mp_pck , log_event .body , dynamic_tenant_id , remove_mpa );
1676
1730
if (ctx -> structured_metadata || ctx -> structured_metadata_map_keys ) {
1677
1731
pack_structured_metadata (ctx , & mp_pck , tag , tag_len , NULL );
1678
1732
}
@@ -1709,7 +1763,7 @@ static flb_sds_t loki_compose_payload(struct flb_loki *ctx,
1709
1763
1710
1764
/* Append the timestamp */
1711
1765
pack_timestamp (& mp_pck , & log_event .timestamp );
1712
- pack_record (ctx , & mp_pck , log_event .body , dynamic_tenant_id );
1766
+ pack_record (ctx , & mp_pck , log_event .body , dynamic_tenant_id , remove_mpa );
1713
1767
if (ctx -> structured_metadata || ctx -> structured_metadata_map_keys ) {
1714
1768
pack_structured_metadata (ctx , & mp_pck , tag , tag_len , log_event .body );
1715
1769
}
@@ -1752,13 +1806,30 @@ static void cb_loki_flush(struct flb_event_chunk *event_chunk,
1752
1806
struct flb_connection * u_conn ;
1753
1807
struct flb_http_client * c ;
1754
1808
struct flb_loki_dynamic_tenant_id_entry * dynamic_tenant_id ;
1809
+ struct flb_loki_remove_mpa_entry * remove_mpa_entry ;
1755
1810
struct mk_list * head ;
1756
1811
struct flb_config_map_val * mv ;
1757
1812
struct flb_slist_entry * key = NULL ;
1758
1813
struct flb_slist_entry * val = NULL ;
1759
1814
1760
1815
dynamic_tenant_id = FLB_TLS_GET (thread_local_tenant_id );
1761
1816
1817
+ remove_mpa_entry = FLB_TLS_GET (thread_local_remove_mpa );
1818
+
1819
+ if (remove_mpa_entry == NULL ) {
1820
+ remove_mpa_entry = remove_mpa_entry_create (ctx );
1821
+ if (!remove_mpa_entry ) {
1822
+ flb_plg_error (ctx -> ins , "cannot allocate remove_mpa entry" );
1823
+ FLB_OUTPUT_RETURN (FLB_RETRY );
1824
+ }
1825
+
1826
+ FLB_TLS_SET (thread_local_remove_mpa , remove_mpa_entry );
1827
+
1828
+ pthread_mutex_lock (& ctx -> remove_mpa_list_lock );
1829
+ cfl_list_add (& remove_mpa_entry -> _head , & ctx -> remove_mpa_list );
1830
+ pthread_mutex_unlock (& ctx -> remove_mpa_list_lock );
1831
+ }
1832
+
1762
1833
if (dynamic_tenant_id == NULL ) {
1763
1834
dynamic_tenant_id = dynamic_tenant_id_create ();
1764
1835
@@ -1784,7 +1855,8 @@ static void cb_loki_flush(struct flb_event_chunk *event_chunk,
1784
1855
(char * ) event_chunk -> tag ,
1785
1856
flb_sds_len (event_chunk -> tag ),
1786
1857
event_chunk -> data , event_chunk -> size ,
1787
- & dynamic_tenant_id -> value );
1858
+ & dynamic_tenant_id -> value ,
1859
+ remove_mpa_entry -> mpa );
1788
1860
1789
1861
if (!payload ) {
1790
1862
flb_plg_error (ctx -> ins , "cannot compose request payload" );
@@ -1982,6 +2054,21 @@ static void release_dynamic_tenant_ids(struct cfl_list *dynamic_tenant_list)
1982
2054
}
1983
2055
}
1984
2056
2057
+ static void release_remove_mpa_entries (struct cfl_list * remove_mpa_list )
2058
+ {
2059
+ struct cfl_list * iterator ;
2060
+ struct cfl_list * backup ;
2061
+ struct flb_loki_remove_mpa_entry * entry ;
2062
+
2063
+ cfl_list_foreach_safe (iterator , backup , remove_mpa_list ) {
2064
+ entry = cfl_list_entry (iterator ,
2065
+ struct flb_loki_remove_mpa_entry ,
2066
+ _head );
2067
+
2068
+ remove_mpa_entry_destroy (entry );
2069
+ }
2070
+ }
2071
+
1985
2072
static int cb_loki_exit (void * data , struct flb_config * config )
1986
2073
{
1987
2074
struct flb_loki * ctx = data ;
@@ -1996,6 +2083,12 @@ static int cb_loki_exit(void *data, struct flb_config *config)
1996
2083
1997
2084
pthread_mutex_unlock (& ctx -> dynamic_tenant_list_lock );
1998
2085
2086
+ pthread_mutex_lock (& ctx -> remove_mpa_list_lock );
2087
+
2088
+ release_remove_mpa_entries (& ctx -> remove_mpa_list );
2089
+
2090
+ pthread_mutex_unlock (& ctx -> remove_mpa_list_lock );
2091
+
1999
2092
loki_config_destroy (ctx );
2000
2093
2001
2094
return 0 ;
@@ -2147,7 +2240,8 @@ static int cb_loki_format_test(struct flb_config *config,
2147
2240
2148
2241
payload = loki_compose_payload (ctx , total_records ,
2149
2242
(char * ) tag , tag_len , data , bytes ,
2150
- & dynamic_tenant_id );
2243
+ & dynamic_tenant_id ,
2244
+ ctx -> remove_mpa );
2151
2245
if (payload == NULL ) {
2152
2246
if (dynamic_tenant_id != NULL ) {
2153
2247
flb_sds_destroy (dynamic_tenant_id );
0 commit comments