1. ভূমিকা
এই কোডল্যাবে, আপনি gRPC ব্যবহার করে একটি ক্লায়েন্ট এবং সার্ভার তৈরি করবেন যা C++ এ লেখা একটি রুট-ম্যাপিং অ্যাপ্লিকেশনের ভিত্তি তৈরি করবে।
টিউটোরিয়ালের শেষে, আপনার কাছে gRPC OpenTelemetry প্লাগইন দিয়ে তৈরি একটি সহজ gRPC HelloWorld অ্যাপ্লিকেশন থাকবে এবং আপনি Prometheus-এ রপ্তানি করা পর্যবেক্ষণযোগ্যতা মেট্রিক্স দেখতে সক্ষম হবেন।
তুমি কি শিখবে
- বিদ্যমান gRPC C++ অ্যাপ্লিকেশনের জন্য OpenTelemetry প্লাগইন কীভাবে সেটআপ করবেন
- একটি স্থানীয় প্রমিথিউস ইনস্ট্যান্স চালানো হচ্ছে
- প্রমিথিউসে মেট্রিক্স রপ্তানি করা হচ্ছে
- প্রমিথিউস ড্যাশবোর্ড থেকে মেট্রিক্স দেখুন
2. শুরু করার আগে
তোমার যা লাগবে
-
git -
curl -
build-essential -
clang - এই কোডল্যাবে উদাহরণ তৈরি করবে
bazel
পূর্বশর্তগুলি ইনস্টল করুন:
sudo apt-get update -y
sudo apt-get upgrade -y
sudo apt-get install -y git curl build-essential clang
bazel bazelisk এর মাধ্যমে ইনস্টল করা যেতে পারে। সর্বশেষ সংস্করণটি এখানে পাওয়া যাবে।
এটি সেট আপ করার একটি সহজ উপায় হল এটিকে আপনার PATH-তে bazel বাইনারি হিসেবে ইনস্টল করা, নিম্নরূপ:
sudo cp bazelisk-linux-amd64 /usr/local/bin/bazel
sudo chmod a+x /usr/local/bin/bazel
বিকল্পভাবে, আপনি CMake ব্যবহার করতে পারেন। CMake ব্যবহারের নির্দেশাবলী এখানে পাওয়া যাবে।
কোডটি পান
আপনার শেখার গতি আরও সহজ করার জন্য, এই কোডল্যাবটি আপনাকে শুরু করতে সাহায্য করার জন্য একটি পূর্ব-নির্মিত সোর্স কোড স্ক্যাফোল্ড অফার করে। নিম্নলিখিত পদক্ষেপগুলি আপনাকে একটি অ্যাপ্লিকেশনে gRPC OpenTelemetry প্লাগইন ব্যবহার করার ক্ষেত্রে সহায়তা করবে।
জিআরপিসি-কোডল্যাবস
এই কোডল্যাবের স্ক্যাফোল্ড সোর্স কোডটি এই গিটহাব ডিরেক্টরিতে পাওয়া যাবে। যদি আপনি নিজে কোডটি বাস্তবায়ন করতে না চান, তাহলে সম্পূর্ণ সোর্স কোডটি সম্পূর্ণ ডিরেক্টরিতে পাওয়া যাবে।
প্রথমে, grpc codelab repo এবং cd কে grpc-cpp-opentelemetry ফোল্ডারে ক্লোন করুন:
git clone https://github.com/grpc-ecosystem/grpc-codelabs.git
cd grpc-codelabs/codelabs/grpc-cpp-opentelemetry/
অন্যথায়, আপনি শুধুমাত্র কোডল্যাব ডিরেক্টরি সম্বলিত .zip ফাইলটি ডাউনলোড করতে পারেন এবং ম্যানুয়ালি এটি আনজিপ করতে পারেন।
bazel ব্যবহার করে gRPC লাইব্রেরি তৈরি করুন:
bazel build start_here/...
৩. ওপেনটেলিমেট্রি প্লাগইন নিবন্ধন করুন
gRPC OpenTelemetry প্লাগইন যোগ করার জন্য আমাদের একটি gRPC অ্যাপ্লিকেশন প্রয়োজন। এই কোডল্যাবে, আমরা একটি সাধারণ gRPC HelloWorld ক্লায়েন্ট এবং সার্ভার ব্যবহার করব যা আমরা gRPC OpenTelemetry প্লাগইন দিয়ে ব্যবহার করব।
আপনার প্রথম ধাপ হল ক্লায়েন্টে Prometheus এক্সপোর্টার দিয়ে কনফিগার করা OpenTelemetry প্লাগইনটি নিবন্ধন করা। আপনার পছন্দের এডিটর দিয়ে codelabs/grpc-cpp-opentelemetry/start_here/greeter_callback_client.cc খুলুন এবং main() কে এইরকম রূপান্তর করুন -
int main(int argc, char **argv) {
absl::ParseCommandLine(argc, argv);
// Codelab Solution: Register a global gRPC OpenTelemetry plugin configured
// with a prometheus exporter.
opentelemetry::exporter::metrics::PrometheusExporterOptions opts;
opts.url = absl::GetFlag(FLAGS_prometheus_endpoint);
auto prometheus_exporter =
opentelemetry::exporter::metrics::PrometheusExporterFactory::Create(opts);
auto meter_provider =
std::make_shared<opentelemetry::sdk::metrics::MeterProvider>();
// The default histogram boundaries are not granular enough for RPCs. Override
// the "grpc.client.attempt.duration" view as recommended by
// https://github.com/grpc/proposal/blob/master/A66-otel-stats.md.
AddLatencyView(meter_provider.get(), "grpc.client.attempt.duration", "s");
meter_provider->AddMetricReader(std::move(prometheus_exporter));
auto status = grpc::OpenTelemetryPluginBuilder()
.SetMeterProvider(std::move(meter_provider))
.BuildAndRegisterGlobal();
if (!status.ok()) {
std::cerr << "Failed to register gRPC OpenTelemetry Plugin: "
<< status.ToString() << std::endl;
return static_cast<int>(status.code());
}
// Continuously send RPCs.
RunClient(absl::GetFlag(FLAGS_target));
return 0;
}
পরবর্তী ধাপ হল সার্ভারে OpenTelemetry প্লাগইন যোগ করা। codelabs/grpc-cpp-opentelemetry/start_here/greeter_callback_server.cc খুলুন এবং main ফাইলটি এভাবে রূপান্তর করুন:
int main(int argc, char** argv) {
absl::ParseCommandLine(argc, argv);
// Register a global gRPC OpenTelemetry plugin configured with a prometheus
// exporter.
opentelemetry::exporter::metrics::PrometheusExporterOptions opts;
opts.url = absl::GetFlag(FLAGS_prometheus_endpoint);
auto prometheus_exporter =
opentelemetry::exporter::metrics::PrometheusExporterFactory::Create(opts);
auto meter_provider =
std::make_shared<opentelemetry::sdk::metrics::MeterProvider>();
// The default histogram boundaries are not granular enough for RPCs. Override
// the "grpc.server.call.duration" view as recommended by
// https://github.com/grpc/proposal/blob/master/A66-otel-stats.md.
AddLatencyView(meter_provider.get(), "grpc.server.call.duration", "s");
meter_provider->AddMetricReader(std::move(prometheus_exporter));
auto status = grpc::OpenTelemetryPluginBuilder()
.SetMeterProvider(std::move(meter_provider))
.BuildAndRegisterGlobal();
if (!status.ok()) {
std::cerr << "Failed to register gRPC OpenTelemetry Plugin: "
<< status.ToString() << std::endl;
return static_cast<int>(status.code());
}
RunServer(absl::GetFlag(FLAGS_port));
return 0;
}
সুবিধার জন্য প্রয়োজনীয় হেডার ফাইল এবং বিল্ড নির্ভরতা ইতিমধ্যেই যোগ করা হয়েছে।
#include "opentelemetry/exporters/prometheus/exporter_factory.h"
#include "opentelemetry/exporters/prometheus/exporter_options.h"
#include "opentelemetry/sdk/metrics/meter_provider.h"
#include <grpcpp/ext/otel_plugin.h>
BUILD ফাইলে বিল্ড নির্ভরতা ইতিমধ্যেই যোগ করা হয়েছে -
cc_binary(
name = "greeter_callback_client",
srcs = ["greeter_callback_client.cc"],
defines = ["BAZEL_BUILD"],
deps = [
"//util:util",
"@com_github_grpc_grpc//:grpc++",
"@com_github_grpc_grpc//:grpcpp_otel_plugin",
"@com_google_absl//absl/flags:flag",
"@com_google_absl//absl/flags:parse",
"@io_opentelemetry_cpp//exporters/prometheus:prometheus_exporter",
"@io_opentelemetry_cpp//sdk/src/metrics",
],
)
৪. উদাহরণটি চালানো এবং মেট্রিক্স দেখা
সার্ভার চালানোর জন্য, চালান -
bazel run start_here:greeter_callback_server
একটি সফল সেটআপের মাধ্যমে, আপনি সার্ভারের জন্য নিম্নলিখিত আউটপুট দেখতে পাবেন -
Server listening on 0.0.0.0:50051
সার্ভারটি চলমান থাকাকালীন, অন্য টার্মিনালে, ক্লায়েন্টটি চালান -
bazel run start_here:greeter_callback_client
একটি সফল দৌড় দেখতে এরকম হবে -
Greeter received: Hello world
Greeter received: Hello world
Greeter received: Hello world
Greeter received: Hello world
Greeter received: Hello world
Greeter received: Hello world
Greeter received: Hello world
Greeter received: Hello world
Greeter received: Hello world
Greeter received: Hello world
Greeter received: Hello world
যেহেতু আমরা প্রোমিথিউস ব্যবহার করে মেট্রিক্স এক্সপোর্ট করার জন্য gRPC OpenTelemetry প্লাগইন সেট-আপ করেছি। সেই মেট্রিক্সগুলি সার্ভারের জন্য localhost:9464 এবং ক্লায়েন্টের জন্য localhost:9465 এ উপলব্ধ থাকবে।
ক্লায়েন্ট মেট্রিক্স দেখতে -
curl localhost:9465/metrics
ফলাফলটি হবে এই ধরণের -
# HELP exposer_transferred_bytes_total Transferred bytes to metrics services
# TYPE exposer_transferred_bytes_total counter
exposer_transferred_bytes_total 0
# HELP exposer_scrapes_total Number of times metrics were scraped
# TYPE exposer_scrapes_total counter
exposer_scrapes_total 0
# HELP exposer_request_latencies Latencies of serving scrape requests, in microseconds
# TYPE exposer_request_latencies summary
exposer_request_latencies_count 0
exposer_request_latencies_sum 0
exposer_request_latencies{quantile="0.5"} Nan
exposer_request_latencies{quantile="0.9"} Nan
exposer_request_latencies{quantile="0.99"} Nan
# HELP target Target metadata
# TYPE target gauge
target_info{otel_scope_name="grpc-c++",otel_scope_version="1.67.0-dev",service_name="unknown_service",telemetry_sdk_version="1.13.0",telemetry_sdk_name="opentelemetry",telemetry_sdk_language="cpp"} 1 1721958543107
# 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_count{grpc_method="helloworld.Greeter/SayHello",grpc_status="OK",grpc_target="dns:///localhost:50051",otel_scope_name="grpc-c++",otel_scope_version="1.67.0-dev"} 96 1721958543107
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-c++",otel_scope_version="1.67.0-dev"} 1248 1721958543107
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-c++",otel_scope_version="1.67.0-dev",le="0"} 0 1721958543107
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-c++",otel_scope_version="1.67.0-dev",le="5"} 0 1721958543107
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-c++",otel_scope_version="1.67.0-dev",le="10"} 0 1721958543107
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-c++",otel_scope_version="1.67.0-dev",le="25"} 96 1721958543107
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-c++",otel_scope_version="1.67.0-dev",le="50"} 96 1721958543107
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-c++",otel_scope_version="1.67.0-dev",le="75"} 96 1721958543107
একইভাবে, সার্ভার সাইড মেট্রিক্সের জন্য -
curl localhost:9464/metrics
৫. প্রমিথিউসে মেট্রিক্স দেখা
এখানে, আমরা একটি প্রমিথিউস ইনস্ট্যান্স সেটআপ করব যা আমাদের gRPC উদাহরণ ক্লায়েন্ট এবং সার্ভারকে স্ক্র্যাপ করবে যারা প্রমিথিউস ব্যবহার করে মেট্রিক্স রপ্তানি করছে।
আপনার প্ল্যাটফর্মের জন্য Prometheus এর সর্বশেষ সংস্করণটি ডাউনলোড করুন , তারপর এটি এক্সট্র্যাক্ট করুন এবং চালান:
tar xvfz prometheus-*.tar.gz
cd prometheus-*
নিম্নলিখিতগুলি দিয়ে একটি প্রোমিথিউস কনফিগারেশন ফাইল তৈরি করুন -
cat > grpc_otel_cpp_prometheus.yml <<EOF
scrape_configs:
- job_name: "prometheus"
scrape_interval: 5s
static_configs:
- targets: ["localhost:9090"]
- job_name: "grpc-otel-cpp"
scrape_interval: 5s
static_configs:
- targets: ["localhost:9464", "localhost:9465"]
EOF
নতুন কনফিগারেশন দিয়ে প্রমিথিউস শুরু করুন -
./prometheus --config.file=grpc_otel_cpp_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 পাঠাতে পারে। (এর সমাধান এখনও দেওয়া হয়নি।)