একটি জেনকিট টেলিমেট্রি প্লাগইন লেখা

ফায়ারবেস জেনকিট লাইব্রেরিগুলিকে ওপেনটেলিমেট্রির সাহায্যে ট্র্যাস, মেট্রিক্স এবং লগ সংগ্রহ করতে সহায়তা করে। জেনকিট ব্যবহারকারীরা একটি প্লাগইন ইনস্টল করে এই টেলিমেট্রি ডেটা পর্যবেক্ষণ এবং ভিজ্যুয়ালাইজেশন সরঞ্জামগুলিতে রপ্তানি করতে পারে যা একটি নির্দিষ্ট OpenTelemetry-সক্ষম সিস্টেমে রপ্তানি করতে OpenTelemetry Go SDK কনফিগার করে।

Genkit-এ একটি প্লাগইন রয়েছে যা Google ক্লাউড মনিটরিং এবং ক্লাউড লগিং- এ ডেটা রপ্তানি করতে OpenTelemetry কনফিগার করে। অন্যান্য মনিটরিং সিস্টেমকে সমর্থন করার জন্য, আপনি এই পৃষ্ঠায় বর্ণিত একটি টেলিমেট্রি প্লাগইন লিখে জেনকিটকে প্রসারিত করতে পারেন।

আপনি শুরু করার আগে

টেলিমেট্রি প্লাগইন সহ যেকোনো ধরনের জেনকিট প্লাগইন লেখার বিষয়ে তথ্যের জন্য Writing Genkit প্লাগইন পড়ুন। বিশেষ করে, মনে রাখবেন যে প্রতিটি প্লাগইনকে অবশ্যই একটি Init ফাংশন রপ্তানি করতে হবে, যা ব্যবহারকারীরা প্লাগইন ব্যবহার করার আগে কল করবে বলে আশা করা হয়।

রপ্তানিকারক এবং লগার

আগেই বলা হয়েছে, একটি টেলিমেট্রি প্লাগইনের প্রাথমিক কাজ হল ওপেনটেলিমেট্রি কনফিগার করা (যার সাথে Genkit ইতিমধ্যেই ইন্সট্রুমেন্ট করা হয়েছে) একটি নির্দিষ্ট পরিষেবায় ডেটা এক্সপোর্ট করা। এটি করার জন্য, আপনার নিম্নলিখিতগুলি প্রয়োজন:

  • OpenTelemetry এর SpanExporter ইন্টারফেসের একটি বাস্তবায়ন যা আপনার পছন্দের পরিষেবাতে ডেটা রপ্তানি করে।
  • OpenTelemetry এর metric.Exporter ইন্টারফেসের একটি বাস্তবায়ন যা আপনার পছন্দের পরিষেবাতে ডেটা রপ্তানি করে।
  • হয় একটি slog.Logger অথবা slog.Handler ইন্টারফেসের একটি বাস্তবায়ন, যা আপনার পছন্দের পরিষেবাতে লগগুলি রপ্তানি করে৷

আপনি যে পরিষেবাটিতে রপ্তানি করতে আগ্রহী তার উপর নির্ভর করে, এটি একটি অপেক্ষাকৃত ছোট প্রচেষ্টা বা বড় একটি হতে পারে৷

যেহেতু ওপেনটেলিমেট্রি একটি শিল্প মান, অনেক মনিটরিং পরিষেবাতে ইতিমধ্যেই লাইব্রেরি রয়েছে যা এই ইন্টারফেসগুলিকে বাস্তবায়ন করে। উদাহরণস্বরূপ, Genkit-এর জন্য googlecloud প্লাগইনটি Google ক্লাউড টিম দ্বারা রক্ষণাবেক্ষণ করা opentelemetry-operations-go লাইব্রেরি ব্যবহার করে। একইভাবে, অনেক মনিটরিং সার্ভিস লাইব্রেরি প্রদান করে যা স্ট্যান্ডার্ড slog ইন্টারফেস বাস্তবায়ন করে।

অন্যদিকে, যদি আপনার পরিষেবার জন্য এই ধরনের কোনও লাইব্রেরি উপলব্ধ না হয়, প্রয়োজনীয় ইন্টারফেসগুলি বাস্তবায়ন করা একটি উল্লেখযোগ্য প্রকল্প হতে পারে।

ইন্টিগ্রেশন ইতিমধ্যে উপলব্ধ কিনা দেখতে OpenTelemetry রেজিস্ট্রি বা মনিটরিং পরিষেবার ডক্স পরীক্ষা করুন।

আপনি যদি এই ইন্টিগ্রেশনগুলি নিজে তৈরি করতে চান, তাহলে অফিসিয়াল ওপেনটেলিমেট্রি রপ্তানিকারকদের উত্স এবং পৃষ্ঠা A Guide to Writing slog Handlers দেখুন।

প্লাগইন তৈরি করা

নির্ভরতা

প্রতিটি টেলিমেট্রি প্লাগইনকে জেনকিট কোর লাইব্রেরি এবং বেশ কয়েকটি ওপেনটেলিমেট্রি লাইব্রেরি আমদানি করতে হবে:

import {
	// Import the Genkit core library.
	"github.com/firebase/genkit/go/core"

	// Import the OpenTelemetry libraries.
	"go.opentelemetry.io/otel"
	"go.opentelemetry.io/otel/sdk/metric"
	"go.opentelemetry.io/otel/sdk/trace"
}

আপনি যদি একটি বিদ্যমান OpenTelemetry বা slog ইন্টিগ্রেশনের চারপাশে একটি প্লাগইন তৈরি করেন, তাহলে আপনাকে সেগুলিও আমদানি করতে হবে।

Config

একটি টেলিমেট্রি প্লাগইন, সর্বনিম্নভাবে, নিম্নলিখিত কনফিগারেশন বিকল্পগুলিকে সমর্থন করবে:

type Config struct {
	// Export even in the dev environment.
	ForceExport bool

	// The interval for exporting metric data.
	// The default is 60 seconds.
	MetricInterval time.Duration

	// The minimum level at which logs will be written.
	// Defaults to [slog.LevelInfo].
	LogLevel slog.Leveler
}

অনুসরণ করা উদাহরণগুলি অনুমান করে যে আপনি এই বিকল্পগুলি উপলব্ধ করছেন এবং সেগুলি কীভাবে পরিচালনা করবেন সে সম্পর্কে কিছু নির্দেশিকা প্রদান করবে।

বেশিরভাগ প্লাগইনে এটি যে পরিষেবাতে রপ্তানি করছে তার জন্য কনফিগারেশন সেটিংসও অন্তর্ভুক্ত করবে (API কী, প্রকল্পের নাম এবং আরও অনেক কিছু)।

Init()

একটি টেলিমেট্রি প্লাগইনের Init() ফাংশন নিম্নলিখিত সমস্ত কাজ করবে:

  • Genkit একটি ডেভেলপমেন্ট এনভায়রনমেন্টে (যেমন genkit start এর সাথে চলার সময়) এবং Config.ForceExport বিকল্প সেট না থাকলে তাড়াতাড়ি ফিরে আসুন:

    shouldExport := cfg.ForceExport || os.Getenv("GENKIT_ENV") != "dev"
    if !shouldExport {
    	return nil
    }
    
  • আপনার ট্রেস স্প্যান রপ্তানিকারক শুরু করুন এবং এটি Genkit এর সাথে নিবন্ধন করুন:

    spanProcessor := trace.NewBatchSpanProcessor(YourCustomSpanExporter{})
    core.RegisterSpanProcessor(spanProcessor)
    
  • আপনার মেট্রিক রপ্তানিকারক শুরু করুন এবং OpenTelemetry লাইব্রেরির সাথে এটি নিবন্ধন করুন:

    r := metric.NewPeriodicReader(
    	YourCustomMetricExporter{},
    	metric.WithInterval(cfg.MetricInterval),
    )
    mp := metric.NewMeterProvider(metric.WithReader(r))
    otel.SetMeterProvider(mp)
    

    PeriodicReader আরম্ভ করার সময় ব্যবহারকারী-কনফিগার করা সংগ্রহের ব্যবধান ( Config.MetricInterval ) ব্যবহার করুন।

  • আপনার slog হ্যান্ডলারকে ডিফল্ট লগার হিসাবে নিবন্ধন করুন:

    logger := slog.New(YourCustomHandler{
    	Options: &slog.HandlerOptions{Level: cfg.LogLevel},
    })
    slog.SetDefault(logger)
    

    ব্যবহারকারী-নির্দিষ্ট ন্যূনতম লগ স্তর ( Config.LogLevel ) মানতে আপনার হ্যান্ডলারকে কনফিগার করা উচিত।

PII রিডাকশন

যেহেতু বেশিরভাগ জেনারেটিভ AI ফ্লোগুলি কোনও ধরণের ব্যবহারকারীর ইনপুট দিয়ে শুরু হয়, এটি একটি সম্ভাব্য সম্ভাবনা যে কিছু ফ্লো ট্রেসে ব্যক্তিগতভাবে সনাক্তযোগ্য তথ্য (PII) থাকে। আপনার ব্যবহারকারীদের তথ্য সুরক্ষিত করতে, আপনি PII রপ্তানি করার আগে ট্রেস থেকে রিডাক্ট করুন।

আপনি যদি আপনার নিজস্ব স্প্যান রপ্তানিকারক তৈরি করেন তবে আপনি এতে এই কার্যকারিতা তৈরি করতে পারেন।

আপনি যদি একটি বিদ্যমান OpenTelemetry ইন্টিগ্রেশনের চারপাশে আপনার প্লাগইন তৈরি করছেন, তাহলে আপনি প্রদত্ত স্প্যান রপ্তানিকারকটিকে একটি কাস্টম রপ্তানিকারকের সাথে মোড়ানো করতে পারেন যা এই কাজটি সম্পাদন করে। উদাহরণস্বরূপ, googlecloud প্লাগইন প্রতিটি স্প্যান থেকে genkit:input এবং genkit:output বৈশিষ্ট্যগুলিকে নিচের মত একটি র‌্যাপার ব্যবহার করে রপ্তানি করার আগে সরিয়ে দেয়:

type redactingSpanExporter struct {
	trace.SpanExporter
}

func (e *redactingSpanExporter) ExportSpans(ctx context.Context, spanData []trace.ReadOnlySpan) error {
	var redacted []trace.ReadOnlySpan
	for _, s := range spanData {
		redacted = append(redacted, redactedSpan{s})
	}
	return e.SpanExporter.ExportSpans(ctx, redacted)
}

func (e *redactingSpanExporter) Shutdown(ctx context.Context) error {
	return e.SpanExporter.Shutdown(ctx)
}

type redactedSpan struct {
	trace.ReadOnlySpan
}

func (s redactedSpan) Attributes() []attribute.KeyValue {
	// Omit input and output, which may contain PII.
	var ts []attribute.KeyValue
	for _, a := range s.ReadOnlySpan.Attributes() {
		if a.Key == "genkit:input" || a.Key == "genkit:output" {
			continue
		}
		ts = append(ts, a)
	}
	return ts
}

সমস্যা সমাধান

আপনি যেখানে আশা করছেন সেখানে দেখানোর জন্য ডেটা পেতে আপনার সমস্যা হলে, OpenTelemetry একটি দরকারী ডায়গনিস্টিক টুল প্রদান করে যা সমস্যার উৎস সনাক্ত করতে সাহায্য করে।