Genkit टेलीमेट्री प्लगिन लिखना

Firebase Genkit लाइब्रेरी को OpenTelemetry की मदद से बनाया जाता है का इस्तेमाल करके ट्रेस, मेट्रिक, और लॉग इकट्ठा करने में मदद मिलती है. Genkit का इस्तेमाल करने वाले लोग इसे एक्सपोर्ट कर सकते हैं ऐसा प्लगिन इंस्टॉल करके जिसे मॉनिटरिंग और विज़ुअलाइज़ेशन टूल के लिए टेलीमेट्री डेटा से जोड़ा गया है यह OpenTelemetry Go SDK को कॉन्फ़िगर करती है किसी खास OpenTelemetry-चालू सिस्टम में एक्सपोर्ट करने के लिए.

Genkit में एक ऐसा प्लगिन शामिल है जो OpenTelemetry को कॉन्फ़िगर करके, डेटा को Google Cloud मॉनिटरिंग और क्लाउड लॉगिंग. समर्थन के लिए तो टेलीमेट्री प्लगिन लिखकर, Genkit का इस्तेमाल किया जा सकता है. जैसा कि इस पेज पर बताया गया है.

शुरू करने से पहले

लिखने के बारे में जानकारी पाने के लिए, Genkit प्लगिन लिखने के बारे में पढ़ें किसी भी तरह का Genkit प्लगिन शामिल किया जा सकता है. इसमें टेलीमेट्री प्लगिन भी शामिल हैं. खास तौर पर, ध्यान दें कि हर प्लगिन के लिए एक Init फ़ंक्शन एक्सपोर्ट करना ज़रूरी है, जिसे उपयोगकर्ताओं को कॉल करना चाहिए प्लगिन का इस्तेमाल करें.

एक्सपोर्टर और लॉगर

जैसा कि पहले बताया गया है, टेलीमेट्री प्लगिन का मुख्य काम है, उसे कॉन्फ़िगर करना डेटा एक्सपोर्ट करने के लिए OpenTelemetry - Genkit के साथ पहले ही इसका इस्तेमाल किया जा चुका है एक विशेष सेवा के लिए साइन इन करना होगा. इसके लिए, आपको इनकी ज़रूरत होगी:

  • OpenTelemetry के SpanExporter को लागू करना ऐसा इंटरफ़ेस जो आपकी पसंद की सेवा पर डेटा एक्सपोर्ट करता है.
  • OpenTelemetry के metric.Exporter को लागू करना ऐसा इंटरफ़ेस जो आपकी पसंद की सेवा पर डेटा एक्सपोर्ट करता है.
  • slog.Logger या slog.Handler को लागू करना है इंटरफ़ेस आपकी पसंद की सेवा पर लॉग एक्सपोर्ट करता है.

आपको जिस सेवा में एक्सपोर्ट करना है उसके आधार पर यह कम मेहनत में या ज़्यादा कोशिश करना.

OpenTelemetry एक इंडस्ट्री स्टैंडर्ड है, इसलिए निगरानी करने वाली कई सेवाएं पहले से ही ऐसी लाइब्रेरी होती हैं जो इन इंटरफ़ेस को लागू करती हैं. उदाहरण के लिए, googlecloud Genkit के लिए प्लगिन opentelemetry-operations-go लाइब्रेरी का रखरखाव किया जाता है, जिसे Google Cloud टीम मैनेज करती है. इसी तरह, कई निगरानी सेवाएं ऐसी लाइब्रेरी उपलब्ध कराती हैं जो स्टैंडर्ड slog इंटरफ़ेस.

दूसरी ओर, अगर आपकी सेवा के लिए ऐसी कोई लाइब्रेरी उपलब्ध नहीं हैं, ऐसे में, ज़रूरी इंटरफ़ेस को लागू करना एक बड़ा प्रोजेक्ट हो सकता है.

OpenTelemetry रजिस्ट्री देखें या मॉनिटरिंग सेवा के दस्तावेज़ों में जाकर देखें कि इंटिग्रेशन पहले से उपलब्ध हैं या नहीं.

अगर आपको ये इंटिग्रेशन खुद बनाने हैं, तो इनके सोर्स पर नज़र डालें OpenTelemetry एक्सपोर्ट करने वाले आधिकारिक संगठन और पेज अ गाइड टू राइटिंग slog हैंडलर पेज.

प्लगिन बनाना

डिपेंडेंसी

हर टेलीमेट्री प्लगिन को Genkit कोर लाइब्रेरी इंपोर्ट करने और कई अन्य OpenTelemetry लाइब्रेरी:

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
}

आगे दिए गए उदाहरणों में यह माना गया है कि आपने इन विकल्पों को उपलब्ध कराया है और उन्हें हैंडल करने के तरीकों के बारे में कुछ जानकारी दें.

ज़्यादातर प्लगिन में, उनकी सेवा के लिए कॉन्फ़िगरेशन सेटिंग भी शामिल होंगी एक्सपोर्ट किया जा रहा है (एपीआई पासकोड, प्रोजेक्ट का नाम वगैरह).

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)
    

    उपयोगकर्ता के कॉन्फ़िगर किए गए कलेक्शन इंटरवल (Config.MetricInterval) का इस्तेमाल तब करें, जब PeriodicReader शुरू कर रहा है.

  • अपने slog हैंडलर को डिफ़ॉल्ट लॉगर के तौर पर रजिस्टर करें:

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

    आपको उपयोगकर्ता के बताए गए कम से कम लॉग का पालन करने के लिए अपने हैंडलर को कॉन्फ़िगर करना चाहिए लेवल (Config.LogLevel).

व्यक्तिगत पहचान से जुड़ी जानकारी हटाना

ज़्यादातर जनरेटिव एआई फ़्लो, उपयोगकर्ता के किसी न किसी इनपुट से शुरू होते हैं. इसलिए, यह ऐसा हो सकता है कि कुछ फ़्लो ट्रेस में व्यक्तिगत पहचान से जुड़ी जानकारी शामिल हो जानकारी (पीआईआई). अपने उपयोगकर्ताओं की तो आपको व्यक्तिगत पहचान से जुड़ी जानकारी छिपानी होगी. से ट्रैक कर सकते हैं.

अगर आपको अपना स्पैन एक्सपोर्टर बनाना है, तो इस सुविधा को भी कर सकते हैं.

अगर आपको किसी मौजूदा 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 डाइग्नोस्टिक टूल जो समस्या के सोर्स का पता लगाने में मदद करती है.