@@ -91,6 +91,14 @@ def __init__(
9191 self ._timeout = timeout
9292 self ._compression = compression
9393 self ._metadata = metadata
94+ # separate x-goog-api-client header from provided metadata
95+ self ._arbitrary_metadata = []
96+ self ._metrics_values = ""
97+ for key , val in metadata :
98+ if key == client_info .METRICS_METADATA_KEY :
99+ self ._metrics_values = val
100+ else :
101+ self ._arbitrary_metadata .append ((key , val ))
94102
95103 def __call__ (
96104 self , * args , timeout = DEFAULT , retry = DEFAULT , compression = DEFAULT , ** kwargs
@@ -116,21 +124,22 @@ def __call__(
116124 if self ._metadata is not None :
117125 metadata = kwargs .get ("metadata" )
118126 if not metadata :
119- kwargs ["metadata" ] = self ._metadata
127+ if self ._metrics_values :
128+ kwargs ["metadata" ] = [(client_info .METRICS_METADATA_KEY , self ._metrics_values ), * self ._arbitrary_metadata ]
129+ else :
130+ kwargs ["metadata" ] = self ._arbitrary_metadata
120131 else :
121132 # Merge user-supplied metadata with library-supplied metadata.
122- # All keys in gRPC metadata are already lowercase.
123- from itertools import chain
124133 metadata = list (metadata )
125- api_client_values = []
134+ metric_values = [ self . _metrics_values ] if self . _metrics_values else []
126135 merged_metadata = []
127- for key , val in chain ( metadata , self . _metadata ) :
128- if key == "x-goog-api-client" :
129- api_client_values .append (val )
136+ for key , val in metadata :
137+ if key == client_info . METRICS_METADATA_KEY :
138+ metric_values .append (val )
130139 else :
131140 merged_metadata .append ((key , val ))
132- if api_client_values :
133- merged_metadata .append (("x-goog-api-client" , " " .join (api_client_values )))
141+ if metric_values :
142+ merged_metadata .append ((client_info . METRICS_METADATA_KEY , " " .join (metric_values )))
134143 kwargs ["metadata" ] = merged_metadata
135144
136145 if self ._compression is not None :
0 commit comments