1. परिचय
इस कोडलैब में, gRPC का इस्तेमाल करके एक क्लाइंट और सर्वर बनाया जाएगा. ये दोनों, Java में लिखे गए रूट-मैपिंग ऐप्लिकेशन की बुनियादी ज़रूरतें पूरी करते हैं.
ट्यूटोरियल के आखिर तक, आपके पास gRPC OpenTelemetry प्लगिन के साथ इंस्ट्रुमेंट किया गया एक सामान्य gRPC HelloWorld ऐप्लिकेशन होगा. साथ ही, Prometheus में एक्सपोर्ट की गई ऑब्ज़र्वेबिलिटी मेट्रिक देखी जा सकेंगी.
आपको क्या सीखने को मिलेगा
- मौजूदा gRPC Java ऐप्लिकेशन के लिए, OpenTelemetry प्लगिन को सेट अप करने का तरीका
- स्थानीय Prometheus इंस्टेंस चलाना
- Prometheus में मेट्रिक एक्सपोर्ट करना
- Prometheus डैशबोर्ड से मेट्रिक देखना
2. शुरू करने से पहले
आपको किन चीज़ों की ज़रूरत होगी
gitcurlJDKv8 या इसके बाद का वर्शन
ज़रूरी शर्तें पूरी करें:
sudo apt-get update -y
sudo apt-get upgrade -y
sudo apt-get install -y git curl
कोड प्राप्त करें
इस कोडलैब में, पहले से बना हुआ सोर्स कोड स्केफ़ोल्ड उपलब्ध है. इससे आपको शुरुआत करने में मदद मिलेगी. यहां दिए गए चरणों से, आपको किसी ऐप्लिकेशन में gRPC OpenTelemetry प्लगिन को लागू करने के बारे में जानकारी मिलेगी.
इस कोडलैब के लिए, स्कैफ़ोल्ड सोर्स कोड इस GitHub डायरेक्ट्री में उपलब्ध है. अगर आपको कोड खुद लागू नहीं करना है, तो पूरा सोर्स कोड completed डायरेक्ट्री में उपलब्ध है.
सबसे पहले, grpc कोडलैब रेपो को क्लोन करें और grpc-java-opentelemetry फ़ोल्डर में cd करें:
git clone https://github.com/grpc-ecosystem/grpc-codelabs.git
cd grpc-codelabs/codelabs/grpc-java-opentelemetry/
इसके अलावा, सिर्फ़ कोडलैब डायरेक्ट्री वाली .zip फ़ाइल डाउनलोड करके, उसे मैन्युअल तरीके से अनज़िप किया जा सकता है.
3. OpenTelemetry प्लगिन रजिस्टर करना
gRPC OpenTelemetry प्लगिन जोड़ने के लिए, हमें gRPC ऐप्लिकेशन की ज़रूरत होती है. इस कोडलैब में, हम एक सामान्य gRPC HelloWorld क्लाइंट और सर्वर का इस्तेमाल करेंगे. हम इसे gRPC OpenTelemetry प्लगिन के साथ इंस्ट्रुमेंट करेंगे.
सबसे पहले, आपको क्लाइंट में Prometheus एक्सपोर्टर के साथ कॉन्फ़िगर किए गए OpenTelemetry प्लगिन को रजिस्टर करना होगा. अपने पसंदीदा एडिटर में codelabs/grpc-java-opentelemetry/start_here/src/main/java/io/grpc/codelabs/opentelemetry/OpenTelemetryClient.java खोलें. इसके बाद, gRPC Java OpenTelemetry API को सेट अप करने के लिए, main में कोड जोड़ें.
क्लाइंट पर इंस्ट्रूमेंटेशन सेट अप करना
Prometheus एक्सपोर्टर बनाना
OpenTelemetry मेट्रिक को Prometheus फ़ॉर्मैट में बदलने के लिए, PrometheusHttpServer बनाएं. साथ ही, HttpServer के ज़रिए इन्हें दिखाएं. नीचे दिया गया कोड स्निपेट, एक नया Prometheus Exporter बनाता है.
// Default prometheus port i.e `prometheusPort` has been initialized to 9465
PrometheusHttpServer prometheusExporter = PrometheusHttpServer.builder()
.setPort(prometheusPort)
.build();
OpenTelemetry SDK टूल का इंस्टेंस बनाना
SdkMeterProvider से मेट्रिक पढ़ने के लिए, ऊपर दिए गए create prometheusExporter को MetricReader के तौर पर रजिस्टर करें. SdkMeterProvider का इस्तेमाल, मेट्रिक की सेटिंग कॉन्फ़िगर करने के लिए किया जाता है.
SdkMeterProvider sdkMeterProvider = SdkMeterProvider.builder()
.registerMetricReader(prometheusExporter)
.build();
OpenTelemetry को लागू करने के लिए, ऊपर बनाए गए sdkMeterProvider की मदद से OpenTelemetrySdk का इंस्टेंस बनाएं.
OpenTelemetrySdk openTelemetrySdk =OpenTelemetrySdk.builder()
.setMeterProvider(sdkMeterProvider)
.build();
GrpcOpenTelemetry इंस्टेंस बनाना
GrpcOpenTelemetry API का इस्तेमाल करके, OpenTelemetry SDK सेट करें. यह Prometheus Metric exporter का इस्तेमाल करता है.
GrpcOpenTelemetry grpcOpenTelmetry = GrpcOpenTelemetry.newBuilder()
.sdk(openTelemetrySdk)
.build();
// Registers gRPC OpenTelemetry globally.
grpcOpenTelmetry.registerGlobal();
GrpcOpenTelemetry इंस्टेंस को registerGlobal का इस्तेमाल करके, ग्लोबल लेवल पर रजिस्टर करने के बाद, बाद में बनाए गए सभी gRPC क्लाइंट और सर्वर को OpenTelemetry के साथ इंस्ट्रुमेंट किया जाएगा.
OpenTelemetry SDK बंद करें
ShutDownHook के अंदर शटडाउन होना चाहिए. openTelemetrySdk.close() एसडीके को बंद कर देता है. साथ ही, SdkMeterProvider पर शटडाउन को कॉल करता है.
सर्वर पर इंस्ट्रूमेंटेशन सेट अप करना
इसी तरह, GrpcOpenTelemetry को सर्वर में भी जोड़ते हैं. codelabs/grpc-java-opentelemetry/start_here/src/main/java/io/grpc/codelabs/opentelemetry/OpenTelemetryServer.java खोलें और GrpcOpenTelemetry को शुरू करने के लिए कोड जोड़ें.
Prometheus एक्सपोर्टर बनाना
इस कोडलैब को एक ही मशीन से चलाया जा सकता है. इसलिए, हम gRPC सर्वर साइड मेट्रिक को होस्ट करने के लिए किसी दूसरे पोर्ट का इस्तेमाल कर रहे हैं. इससे PrometheusHttpServer बनाते समय, पोर्ट से जुड़ी समस्याएं नहीं होंगी.
// Default prometheus port i.e `prometheusPort` has been set to 9464
PrometheusHttpServer prometheusExporter = PrometheusHttpServer.builder()
.setPort(prometheusPort)
.build();
OpenTelemetry SDK टूल का इंस्टेंस बनाना
SdkMeterProvider sdkMeterProvider = SdkMeterProvider.builder()
.registerMetricReader(prometheusExporter)
.build();
OpenTelemetry SDK की मदद से GrpcOpenTelemetry को शुरू करना
OpenTelemetrySdk openTelemetrySdk =OpenTelemetrySdk.builder()
.setMeterProvider(sdkMeterProvider)
.build();
GrpcOpenTelemetry इंस्टेंस बनाना
GrpcOpenTelemetry grpcOpenTelmetry = GrpcOpenTelemetry.newBuilder()
.sdk(openTelemetrySdk)
.build();
// Registers gRPC OpenTelemetry globally.
grpcOpenTelmetry.registerGlobal();
OpenTelemetry SDK बंद करें
gRPC चैनल बंद होने के बाद. openTelemetrySdk.close() को कॉल करने पर, एसडीके बंद हो जाता है. साथ ही, यह SdkMeterProvider पर शटडाउन को भी कॉल करता है.
4. उदाहरण को चलाना और मेट्रिक देखना
सर्वर चलाने के लिए, यह कमांड चलाएं -
cd start_here
../gradlew installDist
./build/install/start_here/bin/opentelemetry-server
सेटअप पूरा होने के बाद, आपको सर्वर के लिए यह आउटपुट दिखेगा -
[date and time] io.grpc.codelabs.opentelemetry.OpenTelemetryServer start
INFO: Server started, listening on 50051
जब सर्वर चल रहा हो, तब दूसरे टर्मिनल पर क्लाइंट चलाएं -
./build/install/start_here/bin/opentelemetry-client world
सक्सेसफ़ुल रन कुछ ऐसा दिखेगा -
[date and time]io.grpc.codelabs.opentelemetry.OpenTelemetryClient greet
INFO: Greeting: Hello world
[date and time] io.grpc.codelabs.opentelemetry.OpenTelemetryClient greet
INFO: Will try to greet world ...
[date and time]io.grpc.codelabs.opentelemetry.OpenTelemetryClient greet
INFO: Greeting: Hello world
हमने Prometheus का इस्तेमाल करके मेट्रिक एक्सपोर्ट करने के लिए, gRPC OpenTelemetry प्लगिन सेट अप किया है. ये मेट्रिक, सर्वर के लिए localhost:9464 और क्लाइंट के लिए localhost:9465 पर उपलब्ध होंगी.
क्लाइंट मेट्रिक देखने के लिए -
curl localhost:9465/metrics
नतीजा इस तरह का होगा -
# HELP grpc_client_attempt_duration_seconds Time taken to complete a client call attempt
# TYPE grpc_client_attempt_duration_seconds histogram
grpc_client_attempt_duration_seconds_bucket{grpc_method="helloworld.Greeter/SayHello",grpc_status="OK",grpc_target="dns:///localhost:50051",otel_scope_name="grpc-java",otel_scope_version="1.66.0",le="0.002"} 0
grpc_client_attempt_duration_seconds_bucket{grpc_method="helloworld.Greeter/SayHello",grpc_status="OK",grpc_target="dns:///localhost:50051",otel_scope_name="grpc-java",otel_scope_version="1.66.0",le="0.003"} 2
grpc_client_attempt_duration_seconds_bucket{grpc_method="helloworld.Greeter/SayHello",grpc_status="OK",grpc_target="dns:///localhost:50051",otel_scope_name="grpc-java",otel_scope_version="1.66.0",le="0.004"} 14
grpc_client_attempt_duration_seconds_bucket{grpc_method="helloworld.Greeter/SayHello",grpc_status="OK",grpc_target="dns:///localhost:50051",otel_scope_name="grpc-java",otel_scope_version="1.66.0",le="0.005"} 29
grpc_client_attempt_duration_seconds_bucket{grpc_method="helloworld.Greeter/SayHello",grpc_status="OK",grpc_target="dns:///localhost:50051",otel_scope_name="grpc-java",otel_scope_version="1.66.0",le="0.1"} 33
grpc_client_attempt_duration_seconds_bucket{grpc_method="helloworld.Greeter/SayHello",grpc_status="OK",grpc_target="dns:///localhost:50051",otel_scope_name="grpc-java",otel_scope_version="1.66.0",le="+Inf"} 34
grpc_client_attempt_duration_seconds_count{grpc_method="helloworld.Greeter/SayHello",grpc_status="OK",grpc_target="dns:///localhost:50051",otel_scope_name="grpc-java",otel_scope_version="1.66.0"} 34
grpc_client_attempt_duration_seconds_sum{grpc_method="helloworld.Greeter/SayHello",grpc_status="OK",grpc_target="dns:///localhost:50051",otel_scope_name="grpc-java",otel_scope_version="1.66.0"} 0.46512665300000006
# HELP grpc_client_attempt_rcvd_total_compressed_message_size_bytes Compressed message bytes received per call attempt
# TYPE grpc_client_attempt_rcvd_total_compressed_message_size_bytes histogram
grpc_client_attempt_rcvd_total_compressed_message_size_bytes_bucket{grpc_method="helloworld.Greeter/SayHello",grpc_status="OK",grpc_target="dns:///localhost:50051",otel_scope_name="grpc-java",otel_scope_version="1.66.0",le="0.0"} 0
grpc_client_attempt_rcvd_total_compressed_message_size_bytes_sum{grpc_method="helloworld.Greeter/SayHello",grpc_status="OK",grpc_target="dns:///localhost:50051",otel_scope_name="grpc-java",otel_scope_version="1.66.0"} 442.0
# HELP grpc_client_attempt_sent_total_compressed_message_size_bytes Compressed message bytes sent per client call attempt
# TYPE grpc_client_attempt_sent_total_compressed_message_size_bytes histogram
grpc_client_attempt_sent_total_compressed_message_size_bytes_bucket{grpc_method="helloworld.Greeter/SayHello",grpc_status="OK",grpc_target="dns:///localhost:50051",otel_scope_name="grpc-java",otel_scope_version="1.66.0",le="0.0"} 0
grpc_client_attempt_sent_total_compressed_message_size_bytes_bucket{grpc_method="helloworld.Greeter/SayHello",grpc_status="OK",grpc_target="dns:///localhost:50051",otel_scope_name="grpc-java",otel_scope_version="1.66.0",le="1024.0"} 34
grpc_client_attempt_sent_total_compressed_message_size_bytes_sum{grpc_method="helloworld.Greeter/SayHello",grpc_status="OK",grpc_target="dns:///localhost:50051",otel_scope_name="grpc-java",otel_scope_version="1.66.0"} 238.0
# HELP grpc_client_attempt_started_total Number of client call attempts started
# TYPE grpc_client_attempt_started_total counter
grpc_client_attempt_started_total{grpc_method="helloworld.Greeter/SayHello",grpc_target="dns:///localhost:50051",otel_scope_name="grpc-java",otel_scope_version="1.66.0"} 34.0
# HELP grpc_client_call_duration_seconds Time taken by gRPC to complete an RPC from application's perspective
# TYPE grpc_client_call_duration_seconds histogram
grpc_client_call_duration_seconds_bucket{grpc_method="helloworld.Greeter/SayHello",grpc_status="OK",grpc_target="dns:///localhost:50051",otel_scope_name="grpc-java",otel_scope_version="1.66.0",le="0.0"} 0
grpc_client_call_duration_seconds_bucket{grpc_method="helloworld.Greeter/SayHello",grpc_status="OK",grpc_target="dns:///localhost:50051",otel_scope_name="grpc-java",otel_scope_version="1.66.0",le="0.003"} 2
grpc_client_call_duration_seconds_bucket{grpc_method="helloworld.Greeter/SayHello",grpc_status="OK",grpc_target="dns:///localhost:50051",otel_scope_name="grpc-java",otel_scope_version="1.66.0",le="+Inf"} 34
grpc_client_call_duration_seconds_count{grpc_method="helloworld.Greeter/SayHello",grpc_status="OK",grpc_target="dns:///localhost:50051",otel_scope_name="grpc-java",otel_scope_version="1.66.0"} 34
grpc_client_call_duration_seconds_sum{grpc_method="helloworld.Greeter/SayHello",grpc_status="OK",grpc_target="dns:///localhost:50051",otel_scope_name="grpc-java",otel_scope_version="1.66.0"} 0.512708707
# TYPE target_info gauge
target_info{service_name="unknown_service:java",telemetry_sdk_language="java",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="1.40.0"} 1
इसी तरह, सर्वर साइड मेट्रिक के लिए -
curl localhost:9464/metrics
5. Prometheus पर मेट्रिक देखना
यहां हम एक ऐसा Prometheus इंस्टेंस सेट अप करेंगे जो हमारे gRPC उदाहरण क्लाइंट और सर्वर को स्क्रैप करेगा. ये दोनों, Prometheus का इस्तेमाल करके मेट्रिक एक्सपोर्ट कर रहे हैं.
अपने प्लैटफ़ॉर्म के लिए, Prometheus का नया वर्शन डाउनलोड करें. इसके बाद, इसे एक्सट्रैक्ट करें और चलाएं:
tar xvfz prometheus-*.tar.gz
cd prometheus-*
नीचे दी गई जानकारी के साथ, Prometheus कॉन्फ़िगरेशन फ़ाइल बनाएं -
cat > grpc_otel_java_prometheus.yml <<EOF
scrape_configs:
- job_name: "prometheus"
scrape_interval: 5s
static_configs:
- targets: ["localhost:9090"]
- job_name: "grpc-otel-java"
scrape_interval: 5s
static_configs:
- targets: ["localhost:9464", "localhost:9465"]
EOF
नए कॉन्फ़िगरेशन के साथ Prometheus शुरू करें -
./prometheus --config.file=grpc_otel_java_prometheus.yml
इससे क्लाइंट और सर्वर कोडलैब प्रोसेस से मेट्रिक को कॉन्फ़िगर किया जाएगा, ताकि हर पांच सेकंड में उन्हें स्क्रैप किया जा सके.
मेट्रिक देखने के लिए, http://localhost:9090/graph पर जाएं. उदाहरण के लिए, क्वेरी -
histogram_quantile(0.5, rate(grpc_client_attempt_duration_seconds_bucket[1m]))
क्वांटाइल कैलकुलेशन के लिए एक मिनट की समयावधि का इस्तेमाल करके, कोशिश की गई औसत लेटेन्सी का ग्राफ़ दिखाएगा.
क्वेरी की दर -
increase(grpc_client_attempt_duration_seconds_bucket[1m])
6. (ज़रूरी नहीं) उपयोगकर्ता के लिए कसरत
आपको Prometheus डैशबोर्ड में दिखेगा कि QPS कम है. देखें कि क्या आपको उदाहरण में कोई ऐसा संदिग्ध कोड मिल रहा है जिसकी वजह से क्यूपीएस सीमित हो रहा है.
क्लाइंट कोड में, एक समय में सिर्फ़ एक आरपीसी को प्रोसेस किया जा सकता है. इसे बदला जा सकता है, ताकि क्लाइंट पिछले आरपीसी के पूरा होने का इंतज़ार किए बिना ज़्यादा आरपीसी भेज सके. (इस समस्या को हल करने का तरीका नहीं बताया गया है.)