gRPC জাভাতে বেসিক OpenTelemetry প্লাগইন সেটআপ করুন

1. ভূমিকা

এই কোডল্যাবে, আপনি gRPC ব্যবহার করে একটি ক্লায়েন্ট এবং সার্ভার তৈরি করবেন যা জাভাতে লেখা একটি রুট-ম্যাপিং অ্যাপ্লিকেশনের ভিত্তি তৈরি করবে।

টিউটোরিয়ালের শেষে, আপনার কাছে gRPC OpenTelemetry প্লাগইন দিয়ে তৈরি একটি সহজ gRPC HelloWorld অ্যাপ্লিকেশন থাকবে এবং আপনি Prometheus-এ রপ্তানি করা পর্যবেক্ষণযোগ্যতা মেট্রিক্স দেখতে সক্ষম হবেন।

তুমি কি শিখবে

  • বিদ্যমান gRPC জাভা অ্যাপ্লিকেশনের জন্য OpenTelemetry প্লাগইন কীভাবে সেটআপ করবেন
  • একটি স্থানীয় প্রমিথিউস ইনস্ট্যান্স চালানো হচ্ছে
  • প্রমিথিউসে মেট্রিক্স রপ্তানি করা হচ্ছে
  • প্রমিথিউস ড্যাশবোর্ড থেকে মেট্রিক্স দেখুন

2. শুরু করার আগে

তোমার যা লাগবে

  • git
  • curl
  • JDK v8 বা উচ্চতর

পূর্বশর্তগুলি ইনস্টল করুন:

sudo apt-get update -y
sudo apt-get upgrade -y
sudo apt-get install -y git curl

কোডটি পান

আপনার শেখার গতি আরও সহজ করার জন্য, এই কোডল্যাবটি আপনাকে শুরু করতে সাহায্য করার জন্য একটি পূর্ব-নির্মিত সোর্স কোড স্ক্যাফোল্ড অফার করে। নিম্নলিখিত পদক্ষেপগুলি আপনাকে একটি অ্যাপ্লিকেশনে gRPC OpenTelemetry প্লাগইন ব্যবহার করার ক্ষেত্রে সহায়তা করবে।

জিআরপিসি-কোডল্যাবস

এই কোডল্যাবের স্ক্যাফোল্ড সোর্স কোডটি এই গিটহাব ডিরেক্টরিতে পাওয়া যাবে। যদি আপনি নিজে কোডটি বাস্তবায়ন করতে না চান, তাহলে সম্পূর্ণ সোর্স কোডটি সম্পূর্ণ ডিরেক্টরিতে পাওয়া যাবে।

প্রথমে, grpc codelab repo এবং cd কে grpc-java-opentelemetry ফোল্ডারে ক্লোন করুন:

git clone https://github.com/grpc-ecosystem/grpc-codelabs.git
cd grpc-codelabs/codelabs/grpc-java-opentelemetry/

অন্যথায়, আপনি শুধুমাত্র কোডল্যাব ডিরেক্টরি সম্বলিত .zip ফাইলটি ডাউনলোড করতে পারেন এবং ম্যানুয়ালি এটি আনজিপ করতে পারেন।

৩. ওপেনটেলিমেট্রি প্লাগইন নিবন্ধন করুন

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 পরিবর্তন করুন।

ক্লায়েন্টে ইন্সট্রুমেন্টেশন সেটআপ করুন

প্রমিথিউস এক্সপোর্টার তৈরি করুন

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 থেকে মেট্রিক্স পড়ার জন্য MetricReader হিসেবে prometheusExporter তৈরি করুন। SdkMeterProvider মেট্রিক সেটিংস কনফিগার করতে ব্যবহৃত হয়।

SdkMeterProvider sdkMeterProvider = SdkMeterProvider.builder()
        .registerMetricReader(prometheusExporter)
        .build();

OpenTelemetry এর SDK বাস্তবায়নের জন্য উপরে তৈরি sdkMeterProvider দিয়ে OpenTelemetrySdk এর একটি উদাহরণ তৈরি করুন।

OpenTelemetrySdk openTelemetrySdk =OpenTelemetrySdk.builder()
        .setMeterProvider(sdkMeterProvider)
        .build();

GrpcOpenTelemetry ইনস্ট্যান্স তৈরি করুন

GrpcOpenTelemetry API ব্যবহার করে OpenTelemetry SDK সেট করুন যা Prometheus Metric রপ্তানিকারক ব্যবহার করে।

GrpcOpenTelemetry grpcOpenTelmetry = GrpcOpenTelemetry.newBuilder()
        .sdk(openTelemetrySdk)
        .build();

// Registers gRPC OpenTelemetry globally.
grpcOpenTelmetry.registerGlobal();

একবার একটি GrpcOpenTelemetry ইনস্ট্যান্স registerGlobal ব্যবহার করে বিশ্বব্যাপী নিবন্ধিত হয়ে গেলে, পরবর্তীতে তৈরি সমস্ত gRPC ক্লায়েন্ট এবং সার্ভারগুলিকে OpenTelemetry দিয়ে ইন্সট্রুমেন্ট করা হবে।

OpenTelemetry Sdk বন্ধ করুন

ShutDownHook এর ভেতরেই শাটডাউন করতে হবে। openTelemetrySdk.close() SDK বন্ধ করে দেয় এবং SdkMeterProvider এ শাটডাউনও ডাকে।

সার্ভারে ইন্সট্রুমেন্টেশন সেটআপ করুন

একইভাবে, সার্ভারে GrpcOpenTelemetry যোগ করা যাক। codelabs/grpc-java-opentelemetry/start_here/src/main/java/io/grpc/codelabs/opentelemetry/OpenTelemetryServer.java খুলুন এবং GrpcOpenTelemetry শুরু করার জন্য কোড যোগ করুন।

প্রমিথিউস এক্সপোর্টার তৈরি করুন

যেহেতু এই কোডল্যাবটি একই মেশিন থেকে চালানো হতে পারে, তাই PrometheusHttpServer তৈরি করার সময় পোর্ট দ্বন্দ্ব এড়াতে আমরা gRPC সার্ভার সাইড মেট্রিক্স হোস্ট করার জন্য একটি ভিন্ন পোর্ট ব্যবহার করছি।

// 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() কল করলে SDK বন্ধ হয়ে যায় এবং SdkMeterProvider-এও বন্ধ হয়।

৪. উদাহরণটি চালানো এবং মেট্রিক্স দেখা

সার্ভার চালানোর জন্য, চালান -

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

যেহেতু আমরা প্রোমিথিউস ব্যবহার করে মেট্রিক্স এক্সপোর্ট করার জন্য 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

৫. প্রমিথিউসে মেট্রিক্স দেখা

এখানে, আমরা একটি প্রমিথিউস ইনস্ট্যান্স সেটআপ করব যা আমাদের gRPC উদাহরণ ক্লায়েন্ট এবং সার্ভারকে স্ক্র্যাপ করবে যারা প্রমিথিউস ব্যবহার করে মেট্রিক্স রপ্তানি করছে।

আপনার প্ল্যাটফর্মের জন্য Prometheus এর সর্বশেষ সংস্করণটি ডাউনলোড করুন , তারপর এটি এক্সট্র্যাক্ট করুন এবং চালান:

tar xvfz prometheus-*.tar.gz
cd 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 --config.file=grpc_otel_java_prometheus.yml

এটি ক্লায়েন্ট এবং সার্ভার কোডল্যাব প্রক্রিয়াগুলির মেট্রিক্সগুলিকে প্রতি 5 সেকেন্ডে স্ক্র্যাপ করার জন্য কনফিগার করবে।

মেট্রিক্স দেখতে http://localhost:9090/graph এ যান। উদাহরণস্বরূপ, কোয়েরি -

histogram_quantile(0.5, rate(grpc_client_attempt_duration_seconds_bucket[1m]))

কোয়ান্টাইল গণনার জন্য সময় উইন্ডো হিসেবে ১ মিনিট ব্যবহার করে মধ্যম প্রচেষ্টার বিলম্ব সহ একটি গ্রাফ দেখাবে।

প্রশ্নের হার -

increase(grpc_client_attempt_duration_seconds_bucket[1m])

৬. (ঐচ্ছিক) ব্যবহারকারীর জন্য অনুশীলনী

প্রমিথিউস ড্যাশবোর্ডে, আপনি লক্ষ্য করবেন যে QPS কম। দেখুন আপনি উদাহরণে এমন কোনও সন্দেহজনক কোড সনাক্ত করতে পারেন কিনা যা QPS সীমাবদ্ধ করছে।

উৎসাহীদের জন্য, ক্লায়েন্ট কোডটি একটি নির্দিষ্ট মুহূর্তে শুধুমাত্র একটি মুলতুবি RPC-এর মধ্যেই সীমাবদ্ধ। এটি এমনভাবে পরিবর্তন করা যেতে পারে যাতে ক্লায়েন্ট পূর্ববর্তীগুলি সম্পূর্ণ হওয়ার জন্য অপেক্ষা না করে আরও RPC পাঠাতে পারে। (এর সমাধান এখনও দেওয়া হয়নি।)