1- import numpy as np
2- import matplotlib .pyplot as plt
31import random
4-
52from collections import defaultdict
63
4+ import matplotlib .pyplot as plt
5+ import numpy as np
76from opentelemetry import metrics
87from opentelemetry .sdk .metrics import Counter , MeterProvider
98from opentelemetry .sdk .metrics .export .aggregate import SumAggregator
109from opentelemetry .sdk .metrics .export .controller import PushController
11- from opentelemetry .sdk .metrics .export .in_memory_metrics_exporter import InMemoryMetricsExporter
10+ from opentelemetry .sdk .metrics .export .in_memory_metrics_exporter import (
11+ InMemoryMetricsExporter ,
12+ )
1213from opentelemetry .sdk .metrics .view import View , ViewConfig
1314
14- ## set up opentelemetry
15+ # set up opentelemetry
1516
1617# Sets the global MeterProvider instance
1718metrics .set_meter_provider (MeterProvider ())
4748
4849meter .register_view (counter_view )
4950
50- ## generate the random metric data
51+ # generate the random metric data
52+
5153
5254def unknown_customer_calls ():
5355 """Generate customer call data to our application"""
@@ -58,23 +60,49 @@ def unknown_customer_calls():
5860 random .seed (1 )
5961
6062 # customer 123 is a big user, and made 1000 requests in this timeframe
61- requests = np .random .normal (1000 , 250 , 1000 ) # 1000 requests with average 1000 bytes, covariance 100
63+ requests = np .random .normal (
64+ 1000 , 250 , 1000
65+ ) # 1000 requests with average 1000 bytes, covariance 100
6266
6367 for request in requests :
64- bytes_counter .add (int (request ), {"environment" : "production" , "method" : "REST" , "customer_id" : 123 })
68+ bytes_counter .add (
69+ int (request ),
70+ {
71+ "environment" : "production" ,
72+ "method" : "REST" ,
73+ "customer_id" : 123 ,
74+ },
75+ )
6576
6677 # customer 247 is another big user, making fewer, but bigger requests
67- requests = np .random .normal (5000 , 1250 , 200 ) # 200 requests with average size of 5k bytes
78+ requests = np .random .normal (
79+ 5000 , 1250 , 200
80+ ) # 200 requests with average size of 5k bytes
6881
6982 for request in requests :
70- bytes_counter .add (int (request ), {"environment" : "production" , "method" : "REST" , "customer_id" : 247 })
83+ bytes_counter .add (
84+ int (request ),
85+ {
86+ "environment" : "production" ,
87+ "method" : "REST" ,
88+ "customer_id" : 247 ,
89+ },
90+ )
7191
7292 # There are many other smaller customers
7393 for customer_id in range (250 ):
7494 requests = np .random .normal (1000 , 250 , np .random .randint (1 , 10 ))
7595 method = "REST" if np .random .randint (2 ) else "gRPC"
7696 for request in requests :
77- bytes_counter .add (int (request ), {"environment" : "production" , "method" : method , "customer_id" : customer_id })
97+ bytes_counter .add (
98+ int (request ),
99+ {
100+ "environment" : "production" ,
101+ "method" : method ,
102+ "customer_id" : customer_id ,
103+ },
104+ )
105+
78106
79107unknown_customer_calls ()
80108
@@ -94,10 +122,15 @@ def unknown_customer_calls():
94122 customer_bytes_map [exemplar .dropped_labels ] += exemplar .value
95123
96124
97- customer_bytes_list = sorted (list (customer_bytes_map .items ()), key = lambda t : t [1 ], reverse = True )
125+ customer_bytes_list = sorted (
126+ list (customer_bytes_map .items ()), key = lambda t : t [1 ], reverse = True
127+ )
98128
99129# Save our top 5 customers and sum all of the rest into "Others".
100- top_5_customers = [("Customer {}" .format (dict (val [0 ])["customer_id" ]), val [1 ]) for val in customer_bytes_list [:5 ]] + [("Other Customers" , sum ([val [1 ] for val in customer_bytes_list [5 :]]))]
130+ top_5_customers = [
131+ ("Customer {}" .format (dict (val [0 ])["customer_id" ]), val [1 ])
132+ for val in customer_bytes_list [:5 ]
133+ ] + [("Other Customers" , sum ([val [1 ] for val in customer_bytes_list [5 :]]))]
101134
102135# unzip the data into X (sizes of each customer's contribution) and labels
103136labels , X = zip (* top_5_customers )
@@ -107,26 +140,45 @@ def unknown_customer_calls():
107140plt .show ()
108141
109142# Estimate how many bytes customer 123 sent
110- customer_123_bytes = customer_bytes_map [(("customer_id" , 123 ), ("method" , "REST" ))]
143+ customer_123_bytes = customer_bytes_map [
144+ (("customer_id" , 123 ), ("method" , "REST" ))
145+ ]
111146
112147# Since the exemplars were randomly sampled, all sample_counts will be the same
113148sample_count = exemplars [0 ].sample_count
114149print ("sample count" , sample_count , "custmer" , customer_123_bytes )
115150full_customer_123_bytes = sample_count * customer_123_bytes
116151
117152# With seed == 1 we get 1008612 - quite close to the statistical mean of 1000000! (more exemplars would make this estimation even more accurate)
118- print ("Customer 123 sent about {} bytes this interval" .format (int (full_customer_123_bytes )))
153+ print (
154+ "Customer 123 sent about {} bytes this interval" .format (
155+ int (full_customer_123_bytes )
156+ )
157+ )
119158
120159# Determine the top 25 customers by how many bytes they sent in exemplars
121160top_25_customers = customer_bytes_list [:25 ]
122161
123162# out of those 25 customers, determine how many used grpc, and come up with a ratio
124- percent_grpc = len (list (filter (lambda customer_value : customer_value [0 ][1 ][1 ] == "gRPC" , top_25_customers ))) / len (top_25_customers )
125-
126- print ("~{}% of the top 25 customers (by bytes in) used gRPC this interval" .format (int (percent_grpc * 100 )))
163+ percent_grpc = len (
164+ list (
165+ filter (
166+ lambda customer_value : customer_value [0 ][1 ][1 ] == "gRPC" ,
167+ top_25_customers ,
168+ )
169+ )
170+ ) / len (top_25_customers )
171+
172+ print (
173+ "~{}% of the top 25 customers (by bytes in) used gRPC this interval" .format (
174+ int (percent_grpc * 100 )
175+ )
176+ )
127177
128178# Determine the 50th, 90th, and 99th percentile of byte size sent in
129- quantiles = np .quantile ([exemplar .value for exemplar in exemplars ], [0.5 , 0.9 , 0.99 ])
179+ quantiles = np .quantile (
180+ [exemplar .value for exemplar in exemplars ], [0.5 , 0.9 , 0.99 ]
181+ )
130182print ("50th Percentile Bytes In:" , int (quantiles [0 ]))
131183print ("90th Percentile Bytes In:" , int (quantiles [1 ]))
132184print ("99th Percentile Bytes In:" , int (quantiles [2 ]))
0 commit comments