@@ -90,6 +90,10 @@ public static bool TryGetCounterPayload(this TraceEvent traceEvent, CounterFilte
9090                { 
9191                    HandleCounterRate ( traceEvent ,  filter ,  sessionId ,  out  payload ) ; 
9292                } 
93+                 else  if  ( traceEvent . EventName  ==  "UpDownCounterRateValuePublished" ) 
94+                 { 
95+                     HandleUpDownCounterValue ( traceEvent ,  filter ,  sessionId ,  out  payload ) ; 
96+                 } 
9397                else  if  ( traceEvent . EventName  ==  "TimeSeriesLimitReached" ) 
9498                { 
9599                    HandleTimeSeriesLimitReached ( traceEvent ,  sessionId ,  out  payload ) ; 
@@ -183,7 +187,47 @@ private static void HandleCounterRate(TraceEvent traceEvent, CounterFilter filte
183187            else 
184188            { 
185189                // for observable instruments we assume the lack of data is meaningful and remove it from the UI 
186-                 // this happens when the ObservableCounter callback function throws an exception. 
190+                 // this happens when the ObservableCounter callback function throws an exception 
191+                 // or when the ObservableCounter doesn't include a measurement for a particular set of tag values. 
192+                 payload  =  new  CounterEndedPayload ( meterName ,  instrumentName ,  traceEvent . TimeStamp ) ; 
193+             } 
194+         } 
195+ 
196+         private  static void  HandleUpDownCounterValue ( TraceEvent  traceEvent ,  CounterFilter  filter ,  string  sessionId ,  out  ICounterPayload  payload ) 
197+         { 
198+             payload  =  null ; 
199+ 
200+             string  payloadSessionId  =  ( string ) traceEvent . PayloadValue ( 0 ) ; 
201+ 
202+             if  ( payloadSessionId  !=  sessionId  ||  traceEvent . Version  <  1 )  // Version 1 added the value field. 
203+             { 
204+                 return ; 
205+             } 
206+ 
207+             string  meterName  =  ( string ) traceEvent . PayloadValue ( 1 ) ; 
208+             //string meterVersion = (string)obj.PayloadValue(2); 
209+             string  instrumentName  =  ( string ) traceEvent . PayloadValue ( 3 ) ; 
210+             string  unit  =  ( string ) traceEvent . PayloadValue ( 4 ) ; 
211+             string  tags  =  ( string ) traceEvent . PayloadValue ( 5 ) ; 
212+             //string rateText = (string)traceEvent.PayloadValue(6); // Not currently using rate for UpDownCounters. 
213+             string  valueText  =  ( string ) traceEvent . PayloadValue ( 7 ) ; 
214+ 
215+             if  ( ! filter . IsIncluded ( meterName ,  instrumentName ) ) 
216+             { 
217+                 return ; 
218+             } 
219+ 
220+             if  ( double . TryParse ( valueText ,  NumberStyles . Number  |  NumberStyles . Float ,  CultureInfo . InvariantCulture ,  out  double  value ) ) 
221+             { 
222+                 // UpDownCounter reports the value, not the rate - this is different than how Counter behaves. 
223+                 payload  =  new  UpDownCounterPayload ( meterName ,  instrumentName ,  null ,  unit ,  tags ,  value ,  traceEvent . TimeStamp ) ; 
224+ 
225+             } 
226+             else 
227+             { 
228+                 // for observable instruments we assume the lack of data is meaningful and remove it from the UI 
229+                 // this happens when the ObservableUpDownCounter callback function throws an exception 
230+                 // or when the ObservableUpDownCounter doesn't include a measurement for a particular set of tag values. 
187231                payload  =  new  CounterEndedPayload ( meterName ,  instrumentName ,  traceEvent . TimeStamp ) ; 
188232            } 
189233        } 
0 commit comments