Ana içeriğe geç

Apinizer API Gateway'den Native OpenTelemetry Dışa Aktarımı — Agent'sız ve GenAI-Farkında

OpenTelemetry serisinin tamamlayıcısı

Apinizer Gateway OpenTelemetry Entegrasyonu serisi agent-tabanlı yolu izler: gateway pod'una enjekte edilen bir Java agent, bir Collector, Tempo ve Kubernetes üzerinde bir Prometheus Agent. Bu makale ise diğer yolu izler — ürüne yerleşik olan, hiçbir şey kurmayı gerektirmeyen yol. Bir javaagent ekleyebiliyor ve tam-yığın JVM enstrümantasyonu istiyorsanız seri sizin içindir. Bir konnektör ve tek bir ayarla gateway-farkında trace'ler ve AI token/maliyet telemetrisi istiyorsanız — özellikle de Kubernetes dışında çalışıyorsanız — okumaya devam edin.

Aynı Trace'e İki Yol

Bir API Gateway'den geçen her istek bir hikâyedir: gelir, kontrol edilir, bir backend'e yönlendirilir (ilki başarısız olursa belki ikisine), ve geri döner. OpenTelemetry bu hikâyeyi okuyabileceğiniz bir trace'e dönüştürür. Tek soru, gateway'in bu hikâyeyi nasıl anlattığıdır.

Agent yolu, hikâyeyi uygulamanın dışından kurar: bir javaagent JVM'i izler ve her HTTP, JDBC ve önbellek çağrısını bir span'e dönüştürür. Güçlü ve geniştir, ama agent'ı ekleyecek bir yer ister — genellikle kontrol ettiğiniz bir Kubernetes pod'u.

Native yol ise hikâyeyi ürünün içinden anlatır. Apinizer, kendi trafik günlüğü için, her isteğin tam olarak ne zaman geldiğini, her backend denemesinin ne kadar sürdüğünü ve — AI trafiği için — kaç token harcandığını ve bunun maliyetini zaten kaydeder. Native dışa aktarım, aynı veriyi alıp OpenTelemetry olarak, doğrudan toplayıcınıza konuşur. Agent yok, sidecar yok, deployment değişikliği yok.

Kurulacak bir şey yok

Bir konnektör artı ortam-başına tek bir ayar. Javaagent yok, init container yok, pod annotation'ı yok — dolayısıyla çıplak bir VM'de veya standalone bir kurulumda da Kubernetes'teki kadar iyi çalışır.

Kutudan çıktığı gibi GenAI-farkında

AI Gateway trafiği, genel bir HTTP agent'ının bilmesine imkân olmayan GenAI semantik-kural öznitelik ve metriklerini taşır — sağlayıcı, model, token kullanımı, maliyet, ilk-token-süresi.

İş bağlamı yerleşik

Her span zaten Apinizer korelasyon kimliğini, projeyi ve API proxy adını taşır; böylece bir trace, ek pipeline yapılandırması olmadan doğrudan trafik günlüğüne bağlanır.

Çift dışa aktarıma karşı güvenli

Javaagent'i ve native dışa aktarımı aynı anda çalıştırırsanız Apinizer fark eder — her span'i iki kez göndermek yerine native'i zorla kapatır ve bir uyarı loglar.

Native ve javaagent katman değil, alternatiftir

Bu "seri artı biraz daha" değildir. Aynı trace'leri gateway'den almanın farklı bir yoludur. Ortam başına birini seçin. OpenTelemetry Dışa Aktarımı referansı yan-yana karşılaştırmayı içerir; kısa hâli bu makalenin sonundadır.

Native Yolun Size Verdikleri

Dışa aktarımı açın ve gateway'in işlediği her istek için — REST, SOAP ve WebSocket/gRPC'nin sunucu tarafı — isteğin gerçekte nasıl işlendiğini yansıtan küçük bir span ağacı elde edersiniz:

SpanTürTemsil ettiği adım
İstek span'iSERVERTüm istek yaşam döngüsü, gateway girişinden gateway çıkışına
Backend deneme span'iCLIENTDeneme başına bir span — bir retry veya ikinci bir hedefe failover kendi span'idir
Pipeline span'leriINTERNALİstek- ve yanıt-işleme fazları

Bu span'ler, gateway'in zaten sahip olduğu zamanlamalardan olay sonrasında kurulur; dolayısıyla dışa aktarımı açmak istek başına yeni bir ölçüm maliyeti getirmez. Ve Apinizer gelen W3C traceparent'ı okuyup backend'e taze bir çocuk bağlam ilettiği için, daha büyük bir dağıtık trace'in parçası olarak gelen bir istek onun parçası olarak kalır — çağıranın trace'i, gateway'in span'leri ve enstrümante edilmiş bir backend'in span'leri tek bir trace kimliği altında buluşur.

Bunun üzerine, AI Gateway trafiği genel yolun üretemeyeceği ek bir katman taşır: GenAI inference span'i ve deneme-başına failover adımları, model, token sayıları, maliyet ve gecikme kırılımıyla etiketli. Native dışa aktarımın asıl değerini kanıtladığı yer bu katmandır ve bu makalenin ikinci yarısıdır.

Açmak

Burada uygulanacak bir manifest yok — hepsi ürünün içinde. Dört hamle ve dışa aktarıyorsunuz.

Bir OTLP Collector konnektörü oluşturun

Bağlantı yönetimi altında bir OTLP Collector konnektörü ekleyin. Endpoint'i toplayıcınızın temel URL'ine yönlendirin — tam /v1/traces yoluna değil, http://collector:4318'e; sinyal yolunu Apinizer kendisi ekler. Protokol'ü (HTTP/protobuf veya gRPC) seçin ve toplayıcınız kimlik doğrulama istiyorsa bir Kimlik Doğrulama Başlığı ekleyin — herhangi bir Apinizer secret'ı gibi şifreli saklanır. Toplu-işleme ayarı varsayılanları makuldür; aksini gerektiren bir nedeniniz olana kadar oldukları gibi kalabilir.

Apinizer Manager'da OTLP Collector konnektör formu — Name, Endpoint base URL, Protocol, Auth Header ve batch ayarları alanları
OTLP Collector konnektörünün oluşturulması: Endpoint toplayıcının base URL'idir — sinyal yolunu Apinizer ekler — Protocol HTTP/protobuf ya da gRPC'dir ve Auth Header değeri diğer Apinizer secret'ları gibi şifreli saklanır.
Toplayıcının sizi gerçekten kabul ettiğini kanıtlayın

Test Connection'a basın. İnsanların atlayıp sonra pişman olduğu adım budur. Bir TCP ping değildir — Apinizer kaydettiğiniz ayarlardan gerçek bir dışa aktarıcı kurar ve toplayıcıya tek bir gerçek sentetik span gönderir. Kimlik doğrulama başlığı yanlışsa, TLS zinciri doğrulanmıyorsa ya da yol hatalıysa, üç gün sonra toplayıcınızın neden boş olduğunu merak etmek yerine burada, bir butonda öğrenirsiniz.

Ortamı NATIVE'e alın

Hedef ortamın OpenTelemetry Dışa Aktarım bölümünde Dışa Aktarım Modu'nu NATIVE yapın ve az önce test ettiğiniz konnektörü seçin. Mod varsayılan olarak OFF'tur ve siz onay verene kadar hiçbir maliyeti yoktur — ve ortam-başınadır, yani hazırlık ortamında açıp bir gün izleyebilir, ancak ondan sonra üretime dokunabilirsiniz.

Karşılayabileceğiniz bir örnekleme oranı belirleyin

Örnekleme Oranı, kaç yeni trace tutacağınıza karar verir. Zaten örneklenmiş bir traceparent ile gelen bir istek daima o kararı devralır — dolayısıyla bu oran yalnız gateway'in başlattığı trace'leri yönetir. Yüksek trafikli bir proxy'de düşük başlayın, toplayıcınızın alımını izleyin ve bilinçli olarak artırın.

Platform kurulumunun tamamı budur. Bir ayar daha var ama yalnız AI trafiği için anlamlı — içerik yakalama — ve aşağıda, ne gönderip ne göndermediğinin yanında kendi başlığını hak ediyor.

Gerçekten Çalışıyor mu?

Native yolun rahatlatıcı yanı, doğrulanacak ne kadar az şey olduğudur; çünkü Test Connection adımı zaten zor kısmı — toplayıcınızın Apinizer'ın yükünü uçtan uca kabul ettiğini — kanıtladı. Ondan sonra gerçek trafiği görmek, bir istek gönderip bakma meselesidir.

Etkin ortamdaki bir proxy'den birkaç istek gönderin, sonra toplayıcınızın trace görünümünü açın (yerelde pilot yapıyorsanız debug/dosya dışa aktarıcısını). Düz bir REST proxy için yukarıda anlatılan şekli görürsünüz: bir SERVER span, backend denemesi başına bir CLIENT span ve altlarına yerleşmiş iki pipeline span'i — backend ister ilk denemede ister üçüncüde yanıt vermiş olsun aynı ağaç.

O ilk trace'te kontrol etmeye değer iki şey var, çünkü bunlar en sık duyulan iki endişe:

  • Sorgu dizesi yok. url.path yolu taşır ve ?'ten sonrasını taşımaz. Başlık değerleri, istek ve yanıt gövdeleri ve kimlik bilgileri bir span'e hiç ulaşmaz. Span adları ham URI'yi değil proxy'nin şablon yolunu kullanır; böylece bir milyon farklı URL, bir milyon farklı span adına dönüşmez.
  • Gelen bir trace değiştirildi değil, katıldı. Bir traceparent taşıyan bir istek gönderirseniz, gateway'in SERVER span'i o trace'in çocuğu olarak görünür ve backend'e yaptığı çağrı taze bir çocuk traceparent'ı ileriye taşır. Yayılımın tüm amacı budur: uçtan uca tek bir trace.
Bir trace hiç görünmüyorsa

Olağan neden, Test Connection'ın hiç çalıştırılmamış ya da kaydedilenden farklı bir endpoint'e karşı çalıştırılmış olmasıdır. Native dışa aktarım sessizce gönderir ve güvenli-başarısız olur — bozuk bir toplayıcı trafiğinizi asla bozmaz — dolayısıyla konnektör testi sizin erken-uyarı sisteminizdir. Aynı kaydedilmiş ayarlara karşı testi yeniden çalıştırın.

Bir AI İsteği Neye Benzer?

Native dışa aktarımın, genel bir HTTP agent'ının basitçe yapamayacağı bir şeyi yaptığı yer burasıdır. İstek bir AI çağrısı olduğunda, çıkarımın kendisi işlem ve model adıyla adlandırılan bir CLIENT span'ine dönüşür — örneğin chat gpt-4o-mini — ve OpenTelemetry ekosisteminin geri kalanının zaten anladığı GenAI semantik-kural özniteliklerini taşır:

ÖznitelikSize ne anlatır
gen_ai.operation.namechat, embeddings, execute_tool, invoke_agent, …
gen_ai.provider.nameBilinen sağlayıcı adı (anthropic, aws.bedrock, …)
gen_ai.request.model / gen_ai.response.modelİstediğiniz ile gerçekte yanıtlayan — failover'da farklılaşır
gen_ai.usage.input_tokens / gen_ai.usage.output_tokensSağlayıcı yanıtından doğrudan gelen token sayıları

gen_ai.* namespace'inde yeri olmayan vendor'a özgü ayrıntı ise apinizer.ai.* altında durur — mikro-USD cinsinden maliyet kırılımı, gecikme ayrımı (ilk-token-süresi, çıktı-token-başı-süre), semantik-önbellek isabet bayrağı ve ikinci bir sağlayıcı devreye girmek zorunda kaldığında apinizer.ai.failover.from. Tam liste AI Gateway OpenTelemetry referansındedir.

Bir istek failover yaptığında hikâyeyi kaybetmezsiniz — span kazanırsınız: deneme başına bir CLIENT adımı, böylece trace önce hangi sağlayıcının denendiğini, vazgeçmesinin ne kadar sürdüğünü ve sonunda hangisinin yanıtladığını tam olarak gösterir. Bir semantik-önbellek isabeti de görünür: sıfır token, apinizer.ai.cache.hit=true ve hiç backend adımı yok.

Yalnız Trace Değil, Metrikler de

Span'lerin yanında AI trafiği, OTLP üzerinden GenAI metrik histogramları üretir — gen_ai.client.token.usage, gen_ai.client.operation.duration ve Apinizer'ın maliyet ile ilk-token-süresi histogramları. Bunlar, native dışa aktarım açık olsun olmasın dokunulmadan çalışmaya devam eden gateway'in mevcut apinizer_ai_* Prometheus metriklerinin yanında durur. İki aile farklı nedenlerle vardır: Prometheus her zaman açık ve sıfır-yapılandırmadır; OTLP histogramları gerçek bucket'lanmış dağılımlar taşır, böylece önceden hesaplanmış bir ortalama yerine gerçek p50/p95/p99 elde edersiniz. Stack'inizin zaten sahip olduğu hangisiyse onu kazıyın — ya da ikisini birden.

Tek isim, iki farklı yazım

Prometheus ailesi bir sağlayıcıyı ham koduyla (bedrock) etiketler; OTLP ailesi normalize edilmiş adı (aws.bedrock) kullanır. Birine göre kurulan bir dashboard değişkeni diğeriyle eşleşmez. İlk panel kurarken açık tutulacak tablo sağlayıcı-adı eşlemesidir.

İçerik Yakalama — Bilinçli Olarak Kapalı

Tek AI'a özgü ayar olan AI Prompt/Yanıt İçeriğini Yakala varsayılan olarak kapalıdır ve gerçekten kastetmedikçe kapalı kalmalıdır. Açtığınızda prompt ve yanıt metni span özniteliği olarak birlikte gider — ama yalnız client ve backend'in fiilen gördüğü metin, PII maskeleme çalıştıktan sonra, sizin belirlediğiniz karakter sınırıyla. Ham maske-öncesi gövdeyi asla okumaz. Yine de bu, toplayıcınıza gerçek konuşma içeriğinin çıkması demektir; bu yüzden bunu yalnız toplayıcının kendisi uyumluluk sınırınızın içindeyse etkinleştirin. Ve dürüst boşluğu unutmayın: streaming yanıtlar hiçbir zaman içerik-yakalanmaz, çünkü span'e eklenecek tek bir yanıt gövdesi yoktur.

Dashboard

Panelleri sıfırdan kurmak zorunda değilsiniz. Dokümanlarla birlikte, Prometheus apinizer_ai_* ailesini OTLP gen_ai.* histogramlarıyla birleştiren, içe aktarmaya hazır bir Grafana dashboard'u gelir:

apinizer-ai-gateway-grafana-dashboard.json

Dashboard JSON'unu indirin — Overview, Tokens, Cost, Streaming, Guardrail, Cache ve Reliability satırları

Dashboards → New → Import altında içe aktarın, sonra iki datasource değişkenini Prometheus scrape hedefinize ve toplayıcınızın gen_ai.* metriklerini yazdığı Prometheus-uyumlu depoya yönlendirin. Bu bir trace değil, metrik dashboard'udur.

İki satırı bir söze değer, çünkü kendi sınırları konusunda dürüsttürler. Cache ve Reliability satırları, bugün yalnız span/trace seviyesinde var olan sinyalleri işaret eden bir metin paneli içerir — semantik-önbellek isabet oranı ve önlenen maliyet, ve failover kimden/kime ayrıntısı — arkasında sorgulanacak bir metrik henüz yok. Dashboard, boş bir panel göndermek yerine, bunları AI Trace zaman çizelgesinde ya da öznitelik üzerinde bir TraceQL sorgusuyla incelemenizi söyler. Küçük bir şey, ama eksiklikle yanıltan bir dashboard ile güvenebileceğiniz bir dashboard arasındaki fark budur.

Apinizer AI Gateway Grafana dashboard — iki sağlayıcı üzerinden canlı değerlerle dolu Overview, Tokens ve Cost satırları
İçe aktarılmış dashboard temsili trafik altında: Overview, Tokens ve Cost satırları Prometheus apinizer_ai_* ailesi ve OTLP gen_ai.* histogramlarından besleniyor — durum kırılımıyla istek hızı, uçtan uca ve OTLP gecikme yüzdelikleri, modele göre token hacmi ve sağlayıcı bazlı maliyet.

javaagent mı, Native mi?

Biri hangi yolu seçeceğini sorduğunda kısa hâli:

javaagent (seri)Native (bu makale)
KurulacakJava agent, Kubernetes'te OTel Operator ileHiçbir şey — bir konnektör ve tek bir ayar
GördüğüTüm JVM: HTTP, JDBC, önbellek, her şeyApinizer'ın istek yaşam döngüsü, artı GenAI katmanı
AI farkındalığıGenel HTTP span'leri, GenAI semantiği yokToken, maliyet, model ve gecikme öznitelikleri yerleşik
K8s dışında çalışırEklenecek bir pod isterEvet — çıplak bir VM ya da standalone kurulum uygundur
Aynı anda ikisiOtomatik tespit edilir ve devre dışı bırakılır

Hiçbiri "daha iyi" değildir. Javaagent JVM'in daha fazlasını görür; native, AI trafiğinin anlamının daha fazlasını görür ve hiçbir altyapı gerektirmez. Birçok ekip, Kubernetes makinesine zaten sahip olduğu yerde javaagent'i, başka her yerde native'i çalıştırır. Yapmamanız gereken tek şey, ikisini aynı ortama karşı çalıştırmaktır — ve Apinizer'ın vetosu, bunu kazara yapamayacağınızdan emin olmak için oradadır.

Bilinen Sınırlar

Native dışa aktarım, sonradan şaşırmayasınız diye kenarları konusunda dürüsttür:

  • Streaming yanıtlar hiçbir zaman içerik-yakalanmaz — eklenecek tek bir gövde yoktur.
  • Politika ve koruma span'leri Live Trace ister — politika-başına INTERNAL çocuk span'ler yalnız o istek için Live Trace aktifken görünür; tek başına her-zaman-açık dışa aktarım bunları üretmez.
  • WebSocket ve gRPC yayılım değil, sunucu-tarafı span alır — bir SERVER span üretilir, ama gelen bir traceparent'a katılmak ve birini iletmek şimdilik yalnız HTTP/SOAP'tadır; dolayısıyla WS/gRPC daima taze bir trace başlatır.
  • GenAI semantik kuralları 2026-08 anlık görüntüsüne pinlidir — yukarı akışta hâlâ Development statüsünde, dolayısıyla ara sıra öznitelik yeniden-adlandırması beklenebilir, her zaman release notes'ta belirtilir.

Toparlarken

Agent-tabanlı seri, Apinizer gateway'ini gözlemlemenin bir yolunu gösterdi: bir javaagent ekle, bir Collector ve Tempo çalıştır, JVM'i dışarıdan oku. Native dışa aktarım diğer yoldur — gateway kendi hikâyesini, kurulacak bir agent olmadan ve genel bir agent'ın göremeyeceği AI token, maliyet ve gecikme telemetrisiyle, doğrudan toplayıcınıza anlatır. Bir konnektör, bir Test Connection tıklaması ve tek bir ortam ayarı, ve her istek — REST, SOAP ya da iki kez failover yapmış bir AI çağrısı — okuyabileceğiniz bir trace olarak görünür.

Ayrıntılı öznitelik ve metrik tabloları, kurulum referansı ve tam javaagent-native karşılaştırması için bu iki sayfayı yakın tutun:

Kaynaklar