1
1
use crate :: util:: EmptyStoreManager ;
2
2
use anyhow:: { Context , Result } ;
3
3
use spin_core:: { async_trait, wasmtime:: component:: Resource } ;
4
+ use spin_factor_observe:: ObserveContext ;
4
5
use spin_world:: v2:: key_value;
5
6
use std:: { collections:: HashSet , sync:: Arc } ;
6
7
use table:: Table ;
@@ -37,6 +38,7 @@ pub struct KeyValueDispatch {
37
38
allowed_stores : HashSet < String > ,
38
39
manager : Arc < dyn StoreManager > ,
39
40
stores : Table < Arc < dyn Store > > ,
41
+ observe_context : Option < ObserveContext > ,
40
42
}
41
43
42
44
impl KeyValueDispatch {
@@ -49,12 +51,19 @@ impl KeyValueDispatch {
49
51
allowed_stores : HashSet :: new ( ) ,
50
52
manager : Arc :: new ( EmptyStoreManager ) ,
51
53
stores : Table :: new ( capacity) ,
54
+ observe_context : None ,
52
55
}
53
56
}
54
57
55
- pub fn init ( & mut self , allowed_stores : HashSet < String > , manager : Arc < dyn StoreManager > ) {
58
+ pub fn init (
59
+ & mut self ,
60
+ allowed_stores : HashSet < String > ,
61
+ manager : Arc < dyn StoreManager > ,
62
+ observe_context : Option < ObserveContext > ,
63
+ ) {
56
64
self . allowed_stores = allowed_stores;
57
65
self . manager = manager;
66
+ self . observe_context = observe_context;
58
67
}
59
68
60
69
pub fn get_store ( & self , store : Resource < key_value:: Store > ) -> anyhow:: Result < & Arc < dyn Store > > {
@@ -79,6 +88,9 @@ impl key_value::Host for KeyValueDispatch {}
79
88
impl key_value:: HostStore for KeyValueDispatch {
80
89
#[ instrument( name = "spin_key_value.open" , skip( self ) , err( level = Level :: INFO ) , fields( otel. kind = "client" , kv. backend=self . manager. summary( & name) . unwrap_or( "unknown" . to_string( ) ) ) ) ]
81
90
async fn open ( & mut self , name : String ) -> Result < Result < Resource < key_value:: Store > , Error > > {
91
+ if let Some ( observe_context) = self . observe_context . as_ref ( ) {
92
+ observe_context. reparent_tracing_span ( )
93
+ }
82
94
Ok ( async {
83
95
if self . allowed_stores . contains ( & name) {
84
96
let store = self
@@ -99,6 +111,9 @@ impl key_value::HostStore for KeyValueDispatch {
99
111
store : Resource < key_value:: Store > ,
100
112
key : String ,
101
113
) -> Result < Result < Option < Vec < u8 > > , Error > > {
114
+ if let Some ( observe_context) = self . observe_context . as_ref ( ) {
115
+ observe_context. reparent_tracing_span ( )
116
+ }
102
117
let store = self . get_store ( store) ?;
103
118
Ok ( store. get ( & key) . await )
104
119
}
@@ -110,6 +125,9 @@ impl key_value::HostStore for KeyValueDispatch {
110
125
key : String ,
111
126
value : Vec < u8 > ,
112
127
) -> Result < Result < ( ) , Error > > {
128
+ if let Some ( observe_context) = self . observe_context . as_ref ( ) {
129
+ observe_context. reparent_tracing_span ( )
130
+ }
113
131
let store = self . get_store ( store) ?;
114
132
Ok ( store. set ( & key, & value) . await )
115
133
}
@@ -120,6 +138,9 @@ impl key_value::HostStore for KeyValueDispatch {
120
138
store : Resource < key_value:: Store > ,
121
139
key : String ,
122
140
) -> Result < Result < ( ) , Error > > {
141
+ if let Some ( observe_context) = self . observe_context . as_ref ( ) {
142
+ observe_context. reparent_tracing_span ( )
143
+ }
123
144
let store = self . get_store ( store) ?;
124
145
Ok ( store. delete ( & key) . await )
125
146
}
@@ -130,6 +151,9 @@ impl key_value::HostStore for KeyValueDispatch {
130
151
store : Resource < key_value:: Store > ,
131
152
key : String ,
132
153
) -> Result < Result < bool , Error > > {
154
+ if let Some ( observe_context) = self . observe_context . as_ref ( ) {
155
+ observe_context. reparent_tracing_span ( )
156
+ }
133
157
let store = self . get_store ( store) ?;
134
158
Ok ( store. exists ( & key) . await )
135
159
}
@@ -139,6 +163,9 @@ impl key_value::HostStore for KeyValueDispatch {
139
163
& mut self ,
140
164
store : Resource < key_value:: Store > ,
141
165
) -> Result < Result < Vec < String > , Error > > {
166
+ if let Some ( observe_context) = self . observe_context . as_ref ( ) {
167
+ observe_context. reparent_tracing_span ( )
168
+ }
142
169
let store = self . get_store ( store) ?;
143
170
Ok ( store. get_keys ( ) . await )
144
171
}
0 commit comments