Entegrasyon desenleri
OpenTelemetry Collector uygulamalarınızı Orbtrace'in Doris'ine nasıl bağlar — iki saha deseni, sinyal başına Doris exporter bağlantısı, önerilen üretim ayarları, ileri seviye tuning ve tek host, Kubernetes, OpenShift ve service mesh yerleşimleri.
Orbtrace ürünü gönderir — sunucu, arayüz ve depolama (Apache Doris). Bir OpenTelemetry Collector göndermez. Collector'ı siz çalıştırırsınız ve o telemetrinizi Orbtrace'in Doris'ine yazar.
Bu sayfa Collector'ın mimarinizde nasıl konumlandığı ile ilgilidir. Sadece tek bir servisi içeri almak istiyorsanız Uygulamalarınızı enstrümante edin ile başlayın — kopyala-yapıştır yolu odur. Yerleşime karar verirken buraya dönün.
Zihinsel model
Uygulamalarınız
loglar · izler · metrikler
OpenTelemetry Collector
Standart upstream imaj — biz config veririz, siz çalıştırırsınız.
Orbtrace (ürün)
Collector'ın içinde Orbtrace'e özel hiçbir şey çalışmaz. Düz, değiştirilmemiş contrib imajı artı bir config dosyasıdır. Kurulacak bir Orbtrace agent'ı, eklentisi veya SDK'sı yoktur.
Sayfanın geri kalanını kolaylaştıran üç gerçek:
- Collector,
otel/opentelemetry-collector-contrib'tir. Bir fork değil, bizim build'imiz değil. Tek gereksinim contrib dağıtımıdır, çünkü Doris exporter yalnızca orada gelir. - Exporter, contrib'in kendi
dorisexporter'ıdır. Batch'leri Stream Load ile Doris'e yazar — Doris'in yüksek verimli HTTP yükleme API'si. - Şemanın sahibi Orbtrace'tir, Collector değil. Orbtrace başlarken her tabloyu kendisi oluşturur ve migrate eder. Bu yüzden exporter mutlaka
create_schema: falseile çalışmalıdır — bu en sık yapılan hatadır, aşağıda ayrıntılı.
Hangi desen size uyar?
| Elinizde… | Kullanın | Tek cümlede |
|---|---|---|
| Henüz Collector yok | Desen A | Tek container çalıştırın. Bir dakikada biter. |
| Mevcut bir OTel Collector / pipeline var | Desen B | Tek exporter ekleyin. Yeniden platform kurmayın. |
İkisi de deploy paketinizde compose/otelcol-config.yaml olarak gelen aynı referans config'ten başlar. Bu sayfada anlatılan batching, kuyruk, sampling ve sinyal başına Doris bağlantısı zaten içindedir — elle yazmak yerine oradan kopyalayın.
Desen A — tek Collector, sıfırdan
- 1
Config dosyasını edinin
Collector'ın bir config dosyasına ihtiyacı var —
otelcol-config.yaml. Sıfırdan yazmayın: bu sayfadaki tüm batching, kuyruk, sampling ve sinyal başına Doris bağlantısı zaten yapılmış hazır haliyle Orbtrace deploy paketinizincompose/dizininde gelir. Paket ücretsiz bir public download'dur.Paketi indirin, açın ve
compose/dizininecdyapın —otelcol-config.yamloradadır. - 2
Collector'ı çalıştırın
O
compose/dizininden, Orbtrace yığınının yanında Collector container'ını başlatın:docker run -d --name orbtrace-otelcol \ --network orbtrace-net \ -p 4317:4317 -p 4318:4318 \ -v "$PWD/otelcol-config.yaml:/etc/otelcol-contrib/config.yaml" \ --tmpfs /var/lib/otelcol/queue:rw,mode=1777 \ otel/opentelemetry-collector-contrib:latest - 3
Uygulamalarınızı ona yönlendirin
Her servisin
OTEL_EXPORTER_OTLP_ENDPOINTdeğişkenini bu Collector'a yönlendirin —http://orbtrace-host:4317. Servisiniz saniyeler içinde Orbtrace'te görünür. Dile göre SDK kurulumu Uygulamalarınızı enstrümante edin sayfasında.
`--tmpfs` satırı yalnızca değerlendirme içindir
Collector'ın disk üstü gönderme kuyruğu için bellek içi bir çalışma alanı verir. Basit ama yeniden başlatınca silinir — bir Collector restart'ından uzun süren bir Doris kesintisi, tamponlanmış batch'leri kaybeder. Üretimde Collector'ın yazabileceği gerçek bir volume bağlayın (UID 10001 olarak çalışır): chown 10001 bind mount, ya da Kubernetes'te securityContext.fsGroup: 10001 olan bir PVC.
TLS
Örnek, :4317 üzerinde düz gRPC açar. Collector güvenilir ağ dışından erişilebiliyorsa, önüne bir ters proxy (Caddy veya Nginx) koyarak TLS'i sonlandırın.
Desen B — zaten çalıştırdığınız pipeline'a Orbtrace ekleyin
Zaten bir Collector'ınız var, ya da OTLP konuşan bir vendor agent'ınız. Onu değiştirmeyin. Orbtrace'i ikinci bir hedef olarak ekleyin, böylece aynı telemetri Doris'e de düşer. Mevcut backend'iniz her şeyi almaya devam eder; Orbtrace bir kopya alır. Bu, Orbtrace'i denemenin ya da iki sistemi yan yana çalıştırıp başka bir vendor'dan geçiş yapmanın temiz yoludur.
İki kesin gereksinim:
- Collector'ınız contrib build olmalı.
dorisexporter yalnızcaotel/opentelemetry-collector-contribiçinde gelir. - Her Doris exporter
create_schema: falseile çalışmalı. Orbtrace tabloları zaten oluşturdu; şema oluşturan bir exporter, Orbtrace migrator'ıyla yarışır ve şemayı böler.
Sinyal başına bir exporter kullanın — tek paylaşımlı exporter değil
Tek bir doris: exporter tanımlayıp onu izler, loglar ve metrikler altında listelemek cazip gelir. Yapmayın. Üç sinyal farklı Stream Load ayarlarına ihtiyaç duyar ve paylaşımlı bir exporter üçüne de tek ayarı dayatır. Sahada bu, metrik yüklemelerinin %100'ünü sessizce kırdı; retry'ları izleri aç bıraktı ve Doris canlıdan saatlerce geri kaldı. doris/traces, doris/logs ve doris/metrics'i ayrı tanımlayın. Nedeni bir sonraki bölümde.
Minimum doğru bağlantı budur. Orbtrace'e özel her şey yorum satırlarında:
exporters:
doris/traces:
endpoint: http://orbtrace-host:8030 # Doris FE — HTTP / Stream Load portu
database: orbtrace
username: ${env:DORIS_USER}
password: ${env:DORIS_PASSWORD}
table: { traces: otel_traces }
create_schema: false # ZORUNLU — şemanın sahibi Orbtrace
doris/logs:
endpoint: http://orbtrace-host:8030
database: orbtrace
username: ${env:DORIS_USER}
password: ${env:DORIS_PASSWORD}
table: { logs: otel_logs }
create_schema: false
doris/metrics:
endpoint: http://orbtrace-host:8030
database: orbtrace
username: ${env:DORIS_USER}
password: ${env:DORIS_PASSWORD}
table: { metrics: otel_metrics } # önek — Doris beş ayrı tabloda tutar
create_schema: false
service:
pipelines:
traces: { exporters: [mevcut_exporter, doris/traces] }
logs: { exporters: [mevcut_exporter, doris/logs] }
metrics: { exporters: [mevcut_exporter, doris/metrics] }Bu minimum. Onu hızlı ve dayanıklı yapan üretim ayarları — batching, gönderme kuyrukları, retry'lar, Stream Load header'ları — aşağıdaki Önerilen üretim config'i bölümünde, kopyalamaya hazır. Ya da doğrudan bunları zaten içeren compose/otelcol-config.yaml'dan başlayın.
Desen B müşterileri processor'ları da kopyalar
Orbtrace'in referans config'i, bozuk veriyi Doris'ten uzak tutan birkaç processor çalıştırır — kardinalite koruması, instance-id doldurma, log-zaman-damgası düzeltmesi. Bunlar otomatik değildir. Kendi Collector'ınızı yönetiyorsanız onları da kopyalayın. Bkz. Atmamanız gereken processor'lar.
Doris exporter, alan alan
Her doris/* bloğu aynı bağlantı alanlarını paylaşır. Her birinin ne işe yaradığı:
| Alan | Nedir | Notlar |
|---|---|---|
endpoint | Doris FE HTTP adresi, port 8030 | Stream Load batch'lerinin POST edildiği yer. |
database | Orbtrace veritabanı adı | orbtrace. |
username / password | Doris girişi | Taze paketlenmiş Doris root'u boş parolayla çalışır. Üretimde parola belirleyin. |
table | Sinyali tablosuna eşler | otel_traces / otel_logs / otel_metrics. |
create_schema | Exporter tablo oluşturur mu | Orbtrace için her zaman false. |
`create_schema: false` unutmamanız gereken tek satırdır
Exporter create_schema'yı varsayılan true yapar — koymazsanız kendi tablolarını kurmaya çalışır ve Orbtrace migrator'ıyla yarışır. Bu yüzden onu açıkça false yaparsınız. Bir kez false olunca exporter'ın tüm şema tarafı kapanır: hiç MySQL bağlantısı açmaz ve mysql_endpoint, replication_num, history_days seçenekleri hiçbir şey yapmaz. Yukarıda yer almamalarının sebebi bu — retention, partition'lama ve replikasyon exporter'da değil, Orbtrace'in kendi şemasında yaşar. TTL için burada ayarlanacak bir şey yok.
Şemanın sahibi neden Orbtrace
Orbtrace tabloları, hazır exporter tabloları değildir. İlk migration'ı temel tabloları exporter'ın beklediği tam DDL ile oluşturur — aynı tablo modeli, aynı dağıtım, aynı kolon tipleri — sonra üzerine Orbtrace'in kendi kolonlarını ekler: birleştirilmiş iz kenarları, anomali skorları, sampling kararları. Span stitching, RCA ve replay'i çalıştıran budur. Şemayı exporter oluştursaydı düz tabloları alır, bu özellikleri kaybederdiniz. İkisi birden denerse iki yarım şema elde edersiniz. Bu yüzden create_schema: false, her yerde, her zaman.
Sinyal başına bir exporter: izler, loglar, metrikler
Üç sinyal Doris'te farklı saklanır, bu yüzden farklı yüklenir. Üç exporter'ın sebebi budur.
| İzler | Loglar | Metrikler | |
|---|---|---|---|
| Tablo | otel_traces | otel_logs | otel_metrics_* (beş) |
| Tablo modeli | DUPLICATE KEY | DUPLICATE KEY | DUPLICATE KEY |
| Dağıtım | RANDOM | RANDOM | RANDOM |
load_to_single_tablet | "true" | "true" | "false" |
| Göreli hacim | Yüksek | Yüksek | Düşük |
| Kuyruk derinliği (üretim) | En derin | Orta | Sığ |
Bu yerleşim Orbtrace icadı değildir — Apache Doris'in gözlemlenebilirlik verisi için kendi gözlemlenebilirlik dokümanlarında önerdiği tam yapıdır: sadece-ekleme DUPLICATE KEY modeli, RANDOM dağıtım, time_series compaction, attribute demetleri için VARIANT kolonlar ve sorgulanan alanlarda inverted index. Orbtrace o şemayı gönderir ve üzerine kendi kolonlarını ekler.
İzler
En ağır sinyal ve en çok işlenen. İzler tail sampling'den geçer (her hata ve yavaş izi tut, geri kalanı örnekle), sonra otel_traces'e düşer.
otel_traces, DISTRIBUTED BY RANDOM'dır; bu da load_to_single_tablet: "true"'yu geçerli ve değerli kılar — her batch tüm tablet'lere yayılmak yerine tek bir tablet'e gider, bu da yazma amplifikasyonunu ve compaction baskısını azaltır, etkin yazma eşzamanlılığını artırır. Bu, izler ve loglar için en büyük tek Stream Load verim kaldıracıdır.
Loglar
İzlerle aynı depolama şekli — RANDOM, tek-tablet yükleme açık. Loglar, tutmanız gereken iki ekstra processor alır:
- Bir zaman damgası düzeltmesi. Bazı SDK'lar logları sıfır zaman damgasıyla üretir. Doris'in
1970-01-01için partition'ı yoktur, bu yüzden Stream Load tüm batch'i reddeder, retry kuyruğu dolar ve sağlıklı servislerin logları da başarısız olmaya başlar. Düzeltme, alım-anı zaman damgasını doldurur. Desen B müşterileri bunu kopyalamalı, yoksa filodaki tek bir bozuk SDK log alımını çökertir. - Bir severity filtresi. INFO altı log gürültüsü, Doris'e ulaşmadan Collector'da düşürülür. Eşiği
ORBTRACE_LOG_DROP_BELOWile ayarlayın (bir OTTL severity sabiti, varsayılanSEVERITY_NUMBER_INFO); bir kaçış-kapısı attribute'u tek tek kayıtları eşiğin ötesinde tutar.
Metrikler
table: { metrics: otel_metrics } bir önektir: OpenTelemetry'nin beş metrik şekli vardır (gauge, sum, histogram, exponential histogram, summary) ve Doris her birini kendi tablosunda tutar — otel_metrics_gauge, otel_metrics_sum vb. Yine tek bir doris/metrics exporter tanımlarsınız; o, her datapoint'i doğru tabloya yönlendirir.
Metrikler, kardinalitenin acıttığı tek sinyaldir. İstek başına taze değer taşıyan tek bir user_id etiketi, kullanıcı başına yeni bir zaman serisi yaratır ve metrik tabloları sınırsız büyür. İki processor buna karşı korur — biri bilinen kötü etiket adlarını siler, biri UUID biçimli değerleri tek bir kovaya katlar. Yalnızca metriklerde çalışırlar; izler ve loglar tam değerlerini korur, çünkü orada ayrıntı zaten esas noktadır.
Metrikler load_to_single_tablet: "false" kullanır. Doris'in genel tavsiyesi herhangi bir RANDOM tablo için "true"'dur, ama Nivorbit'in benchmark'ında metrik tabloları için bu flip hiçbir kazanç sağlamadı ve kuyruğu hafif kötüleştirdi, bu yüzden kapalı kalıyor. Değiştirmeden önce kendi donanımınızda ölçün.
Önerilen üretim config'i
Minimum Desen B bloğu bağlanır ama küçük, tamponsuz yükler gönderir. Aşağıda tam önerilen kurulum var — üç sinyalin hepsi, her biri kendi exporter'ı ve kendi pipeline'ıyla. Bu sinyal-başına ayrım, üç exporter'ın tüm sebebidir; loglar ve metrikler opsiyonel eklenti değil, her biri bir blok gerektirir. Üç exporter neredeyse aynıdır: yalnızca aşağıdaki sinyal-başına tablodaki değerler farklıdır.
Bunu yazmanıza gerek yok — hazır gelir
Bu tam olarak compose/otelcol-config.yaml'ın içeriğidir; o dosyada receiver'lar ve tam processor zinciri de vardır. O dosyadan başlayıp ayarlayın; aşağıdaki blok knob'ları görebilmeniz için burada, yeniden yazmanız için değil.
extensions:
file_storage: # tek paylaşımlı disk üstü kuyruk; Doris kesintisini/restart'ı atlatır
directory: /var/lib/otelcol/queue
timeout: 1s
compaction: # bbolt dosyaları bu olmadan asla küçülmez
directory: /var/lib/otelcol/queue
on_start: true
on_rebound: true
rebound_needed_threshold_mib: 100
rebound_trigger_threshold_mib: 10
processors:
batch:
send_batch_size: 100000 # sık küçük yükler değil, büyük yükler hedefleyin
send_batch_max_size: 200000
timeout: 5s
# memory_limiter, kardinalite koruması, log-zaman-damgası düzeltmesi ve tail_sampling
# referans config'te tanımlıdır — aşağıdaki "Atmamanız gereken processor'lar"a bakın.
exporters:
# ── İZLER — en ağır sinyal → en çok consumer, en derin kuyruk ──
doris/traces:
endpoint: http://orbtrace-host:8030
database: orbtrace
username: ${env:DORIS_USER}
password: ${env:DORIS_PASSWORD}
table: { traces: otel_traces }
create_schema: false # zorunlu — şemanın sahibi Orbtrace
timeout: 300s
log_response: true # düşen-satır sayısının göründüğü tek yer
headers: { load_to_single_tablet: "true", max_filter_ratio: "0.01" }
sending_queue: { enabled: true, storage: file_storage, num_consumers: 20, queue_size: 1000 }
retry_on_failure: { enabled: true, initial_interval: 5s, max_interval: 30s, max_elapsed_time: 30s, randomization_factor: 0.5 }
# ── LOGLAR — aynı blok; yalnızca num_consumers / queue_size değişir ──
doris/logs:
endpoint: http://orbtrace-host:8030
database: orbtrace
username: ${env:DORIS_USER}
password: ${env:DORIS_PASSWORD}
table: { logs: otel_logs }
create_schema: false
timeout: 300s
log_response: true
headers: { load_to_single_tablet: "true", max_filter_ratio: "0.01" }
sending_queue: { enabled: true, storage: file_storage, num_consumers: 10, queue_size: 500 }
retry_on_failure: { enabled: true, initial_interval: 5s, max_interval: 30s, max_elapsed_time: 30s, randomization_factor: 0.5 }
# ── METRİKLER — single-tablet KAPALI (ölçülmüş kazanç-yok); daha küçük kuyruk ──
doris/metrics:
endpoint: http://orbtrace-host:8030
database: orbtrace
username: ${env:DORIS_USER}
password: ${env:DORIS_PASSWORD}
table: { metrics: otel_metrics }
create_schema: false
timeout: 300s
log_response: true
headers: { load_to_single_tablet: "false", max_filter_ratio: "0.01" }
sending_queue: { enabled: true, storage: file_storage, num_consumers: 5, queue_size: 200 }
retry_on_failure: { enabled: true, initial_interval: 5s, max_interval: 30s, max_elapsed_time: 30s, randomization_factor: 0.5 }
service:
extensions: [file_storage]
pipelines:
# Her sinyal KENDİ exporter'ını besleyen KENDİ pipeline'ıdır — mesele bu.
# Aşağıdaki processor zincirleri önerilen settir (referans config'te tanımlı).
traces: { receivers: [otlp], processors: [memory_limiter, transform/instance_id, attributes/cardinality_denylist, transform/cardinality_safety, tail_sampling, batch], exporters: [doris/traces] }
logs: { receivers: [otlp], processors: [memory_limiter, transform/instance_id, attributes/cardinality_denylist, transform/cardinality_safety, transform/log_timestamp_fix, filter/logs, batch], exporters: [doris/logs] }
metrics: { receivers: [otlp], processors: [memory_limiter, transform/instance_id, attributes/cardinality_denylist, transform/cardinality_safety, batch], exporters: [doris/metrics] }Sinyal başına değişen tek üç değer:
| Ayar | doris/traces | doris/logs | doris/metrics | Neden |
|---|---|---|---|---|
num_consumers | 20 | 10 | 5 | Her sinyalin hacmiyle ölçekleyin — izler en ağırı. |
queue_size | 1000 | 500 | 200 | Ağır sinyaller için daha derin kuyruk. |
load_to_single_tablet | "true" | "true" | "false" | RANDOM izler/loglar için açık; metrikler için ölçülmüş kazanç-yok. |
Her ayar ne yapar ve ne zaman değiştirilir
| Ayar | Önerilen | Ne zaman değiştirilir |
|---|---|---|
send_batch_size / _max_size | 100000 / 200000 | Sessiz sistemde daha hızlı ilk-görünüm için düşürün; daha fazla verim için yükseltin — ama aşağıdaki BE sınırına uyun. Dev anında geri bildirim için 1024 kullanır. |
batch.timeout | 5s | Düşük hacimde veriyi daha erken görmek isterseniz düşürün (örn. 1s). |
timeout (Stream Load) | 300s | Nadiren. Doris'in varsayılan yük zaman aşımıyla hizalı; bırakın. |
max_filter_ratio | "0.01" | Bozuk satırlı her batch'i reddetmek için "0" (en katı); yalnızca bilinen-gürültülü bir kaynak esneklik gerektiriyorsa yükseltin. |
num_consumers | 20 / 10 / 5 | Alım hızıyla yükseltin ama tüm exporter'lar toplamını BE başına ~128'in altında tutun — Doris'in BE başına yük tavanı. Bunun ötesinde consumer'lar verim değil, çekişme ekler. |
queue_size | 1000 / 500 / 200 | Daha uzun Doris kesintilerini tamponlamak için yükseltin — ve volume'u ona göre büyütün (aşağıya bakın). |
max_elapsed_time | 30s | Bırakın. Daha uzunu, yüklenmeyecek veride bir consumer'ı meşgul eder. |
log_response | true | Açık bırakın. Sessizce filtrelenen satırlara tek görünürlüktür. |
Batch boyutunun Doris tarafında kesin bir tavanı var
Exporter her batch'i tek bir JSON gövdesi olarak gönderir ve Doris BE, ayrıştırmadan önce tüm gövdeyi tamponlar. Bağlayıcı sınır, BE'nin streaming_load_json_max_mb değeridir — varsayılan sadece 100 MB. 200.000 olaylı VARIANT-ağırlıklı bir batch ~400 MB'a ulaşabilir. Ya BE'lerinizde streaming_load_json_max_mb'yi ≥ 512'ye çıkarın (Orbtrace Helm chart'ı bunu yapar) ya da stok BE'lerde send_batch_max_size'ı ≤ 50.000'de sınırlayın. Küçük tutarsanız Stream Load batch'i reddeder.
Kuyruk volume'unu boyutlandırın, yoksa sessizce düşer
En kötü durum disk ≈ Σ(queue_size × send_batch_max_size) × ~2 KB/olay × 2 (bbolt küçülmeme payı). Bu üretim değerleri için kabaca 6 GB'dır — ≥ 8 Gi ayırın. Küçük bir volume, büyütüp tutamadığı batch'leri sessizce düşürür.
Teslimat tasarım gereği en-az-bir-kez
Stream Load retry'lar arasında idempotent değildir — her deneme taze bir label alır, bu yüzden retry edilen bir batch iki kez düşebilir. Bu, veriyi hiç düşürmeme karşılığında kabul edilen bir takastır; kısa retry penceresi çift-düşme yolunu ne sıklıkta vurduğunuzu sınırlar.
İleri seviye tuning (opt-in)
Bunlara yalnızca bir sinyal söylediğinde uzanın. Varsayılanlar çoğu dağıtım için doğrudur.
- Doris Group Commit. Sunucu-tarafı batching: Doris birçok eşzamanlı Stream Load'ı tek bir iç commit'te birleştirir (group commit kılavuzu), böylece daha az tablet versiyonu ve çok daha az compaction baskısı üretir. Gözlemlenebilirliğin ürettiği tam log/yüksek-eşzamanlılık-küçük-yük şekli için Doris'in önerdiği yanıttır — yayınlanmış bir benchmark 1 MB yüklerde ~16× verim gösterir. Bir sinyalin
headers'ınagroup_commit: "async_mode"ekleyin (varsayılanlar: her 10 sn veya 64 MB'da flush, tablo başına ayarlanabilir). İki uyarı: (1) Stream Load + Group Commit, Doris 4.0.2–4.1.0'da aralıklı satır kaybı bildirdi (apache/doris#63160) — önce kendi build'inizde tam satır-sayısı eşitliğini doğrulayın. (2)async_modebir WAL'a yazar ve WAL diski azalırsa sessizce normal yüklemeye düşer, bu yüzden WAL boyutunu izleyin. Yalnızca tablet-versiyon sayıları hafta-hafta tırmanıyorsa VE tek-tablet ile kuyruk kaldıraçları zaten devredeyse açın. - Metrikler için
load_to_single_tablet. Varsayılan kapalı (ölçülmüş kazanç-yok). Donanımınız bizimkinden farklıysa, flip'ten önce A/B test edin. - Batch boyutu vs BE sınırı. Daha fazla verim için
send_batch_size'ı yükseltin, ama yukarıda anlatılanstreaming_load_json_max_mbtavanının altında tutun. - Kuyruk derinliği ve consumer'lar. Daha derin
queue_sizedaha uzun Doris kesintilerini tamponlar; daha fazlanum_consumersyazma paralelliğini artırır. İkisini de alım hızıyla ölçekleyin ve volume'u ona göre boyutlandırın. - Ağ egress'i. Doris exporter Stream Load gövdelerini sıkıştırmadan gönderir. Bir ağ sınırını aşan yüksek-hacimli bir pipeline'da, hattı ham olay byte'larına göre boyutlandırın ve Collector'ı Doris'e yakın tutun.
Dağıtım mimarileri
Desen A ve B Doris'e neyin bağlandığını yanıtlar. Bu bölüm Collector katmanının nerede yaşadığını yanıtlar. Bunlar OpenTelemetry topluluğunun standart yerleşimleridir — agent ve gateway — Orbtrace'e uygulanmış hali.
Tek host veya VM'ler
Orbtrace yığınının yanındaki tek bir Collector, mimarinin tamamıdır. Her servis — o host'ta ya da başka VM'lerde — OTEL_EXPORTER_OTLP_ENDPOINT'ini ona yönlendirir. Tek bir contrib Collector, yardıma ihtiyaç duymadan önce saniyede on binlerce olayı taşır.
Servisleriniz
- Bu host'ta ve başka VM'lerde uygulamalar
- Her SDK Collector'a OTLP gönderir
Tek Collector
- :4317 / :4318 üzerinden OTLP alır
- tail_sampling + batching
- Dayanıklı disk üstü gönderme kuyruğu
Apache Doris
- :8030'da FE
- Logları, izleri, metrikleri saklar
Tek kutu her şeyi yapar. Ölçek sinyali: sürekli Collector CPU doygunluğu veya büyüyen kuyruk — o zaman aşağıdaki iki-katmanlı yerleşime geçin, daha büyük tek Collector'a değil.
Kubernetes — node agent'ları artı bir gateway
Endüstri-standardı Kubernetes yerleşimi iki katmanlıdır ve önerdiğimiz budur.
Agent katmanıDaemonSet — node başına bir
- Yerel pod'lardan OTLP alır
- k8sattributes pod / ns / node zenginleştirir
- Gateway'e iletir
Gateway katmanıDeployment — 2+ replika
- tail_sampling (bir izin tüm span'leri)
- doris/* exporter'lar + dayanıklı kuyruk
- Doris kimlik bilgilerini tutar
Apache Doris
- :8030'da FE
- Logları, izleri, metrikleri saklar
Pod'lar yerel node agent'ına gönderir; agent'lar sampling ve Doris'e yazmayı üstlenen küçük merkezi bir gateway havuzuna iletir.
- Agent katmanı — bir DaemonSet. Node başına bir Collector; pod'lar yerel node agent'ına gönderir. Agent,
k8sattributesprocessor'ı ile pod, namespace, deployment ve node etiketlerini ekler — Orbtrace'te tam da filtrelediğiniz metadata. Yerel teslimat, SDK gecikmesini ve node'lar arası trafiği düşük tutar. - Gateway katmanı — küçük bir Deployment. İki veya daha fazla replika pahalı, durumlu işi yapar: tail sampling ve dayanıklı kuyruklu Doris exporter'lar. Doris kimlik bilgilerini tek katmanda tutmak güvenlik incelemenizi de küçültür.
- Tek aşikâr olmayan kural. Tail sampling, bir izin tüm span'lerini aynı replikada görmelidir. Birden fazla gateway varsa, agent'lar
routing_key: traceIDileloadbalancingyaparak export etmelidir. Düz round-robin veya client-IP yapışkanlığı, bir izi replikalar arasında böler ve her çok-servisli sampling kararını bozar. - Kod-sız enstrümantasyon. OpenTelemetry Operator'ü çalıştırın ve iş yüklerini
InstrumentationCRD'siyle işaretleyerek imajlarınıza dokunmadan otomatik-enstrümantasyon enjekte edin. Collector katmanlarını da yönetebilir.
Küçük başlayın: tek bir gateway Deployment yeterlidir. Node başına metadata istediğinizde DaemonSet'i ekleyin; tek replika doyduğunda tail sampling'i ölçekli gateway'lere bölün.
OpenShift
Aynı iki katman, iki platform notuyla:
- Operator: OperatorHub'dan Red Hat build of OpenTelemetry'i kullanın — OpenShift için paketlenmiş aynı OpenTelemetry Operator'dır.
- Güvenlik: contrib imajı non-root çalışır, bu yüzden katmanlar hiçbir grant olmadan varsayılan
restricted-v2SCC altında çalışır. Gateway'in kuyruk volume'unasecurityContext.fsGroup: 10001ile yazma erişimi verin.
Orbtrace'in kendi OpenShift kurulumu OpenShift sayfasında; bu bölüm yalnızca pipeline ile ilgilidir.
Service mesh (Istio, Linkerd)
Bir mesh, SDK enstrümantasyonunun yerini almaz — ikisi farklı sorulara yanıt verir.
- Uygulamalarınızı enstrümante etmeye devam edin. Envoy sidecar'lar yalnızca pod'lar arasındaki trafiği görür. Bir isteği handler'ınıza, DB çağrınıza ve kuyruk publish'inize ayrıştıramazlar ve trace bağlamını kodunuz boyunca taşıyamazlar. Mesh içindeki enstrümante edilmemiş bir uygulama yine de kopuk tek-atlamalı span'ler üretir.
- W3C
traceparentüzerinde anlaşın. Mesh ve SDK'larınız tek bir bağlam-yayma formatını paylaşmalı. W3C Trace Context standarttır ve her OTel SDK'nın varsayılanıdır; eski B3 yerine onu tercih edin. - Mesh span'leri opsiyonel bir eklentidir. Istio'nun Telemetry API'si Envoy span'lerini OTLP ile export edebilir — başlangıçta düşük bir sampling yüzdesiyle ya da hiç, agent/gateway katmanınıza yönlendirin. Enstrümante uygulamalarla, Envoy span'leri çoğunlukla tabloyu tekrarlarken hacmi katlar.
- Tek egress. Uygulama SDK'ları, mesh telemetrisi ve node agent'ları hepsi aynı Collector katmanından Doris'e akar. Orbtrace'e güvenceye alınacak ya da hata ayıklanacak ikinci bir yol asla yoktur.
Maliyet-farkında sampling
Tail sampling her hata izini, her yavaş izi, her SLO-ihlali ve anomali-etiketli izi tutar, geri kalanını örnekler. "Geri kalan" için olasılıksal taban Orbtrace'ten sürülür: operatörler /admin/sampling'de servis başına aylık iz üst-sınırı belirler ve Orbtrace çözülmüş politikayı /api/sampling/policy.yaml'da YAML olarak yayınlar. Bu, Collector config'ini servis başına düzenlemeden Doris diskini savunur ve sinyal-gürültü oranını yüksek tutar.
Statik politika (varsayılan). Referans config sabit politikalar gönderir — hataları tut, yavaş izleri tut, force-etiketli izleri tut, geri kalanını örnekle. Tek host veya ilk dağıtım için iyidir.
Dinamik politika (üretim). Gateway canlı servis-başına politikayı çeker ve değiştiğinde hot-reload eder:
processors:
tail_sampling:
decision_wait: 30s # tutmayı vaat ettiğiniz en uzun izi aşmalı
num_traces: 100000 # ≥ iz hızı × decision_wait
decision_cache:
sampled_cache_size: 500000
non_sampled_cache_size: 1000000
policies: ${httppoll://orbtrace:8080/api/sampling/policy.yaml?interval=5m&auth_env=ORBTRACE_INGEST_TOKEN}Dinamik politika httppoll sağlayıcısına ihtiyaç duyar
Stok otelcol-contrib bir config URL'sini başlangıçta bir kez çeker ve bir daha çekmez — yerleşik http sağlayıcısında ne yenileme ne de auth vardır. Canlı politika ya httppoll confmap sağlayıcısına (otelcol-orbtrace dağıtımında, ya da github.com/nivorbit/otelcol-confmap-httppoll ile herhangi bir OCB-build Collector'a eklenebilir) ya da bir fetch-to-file-artı-SIGHUP sidecar'ına ihtiyaç duyar. auth_env, değeri bearer token olarak gönderilen bir env değişkeninin adını verir; URL asla sırrı taşımaz.
Kesin-tut vaadinin dürüst sınırı
Tail sampling, bir izin ilk span'i geldikten decision_wait saniye sonra, yalnızca o ana dek gelmiş span'leri kullanarak karar verir. decision_wait'ten uzun süren bir iz, kısmi veriyle karara bağlanır, bu yüzden yavaş kökü kaçırılabilir. decision_wait'i tutmayı vaat ettiğiniz en uzun izin üstüne ayarlayın, num_traces ≥ hız × decision_wait boyutlandırın ve decision_cache'i açık tutun. Hata span'leri yavaş span'lerden güvenlidir — hata anında görünür; "yavaş" ancak span bittiğinde var olur.
Atmamanız gereken processor'lar
Desen A kullanıcıları bunları referans config'ten bedava alır. Kendi Collector'ını yöneten Desen B kullanıcıları onları kopyalamalıdır — bozuk veriyi Doris'ten uzak tutarlar:
memory_limiter— her pipeline'da ilk. Heap ısındığında yeni veriyi reddeder, böylece Collector çökmek yerine yükü boşaltır.transform/instance_id—service.instance.id'yik8s.pod.nameveyahost.name'den doldurur, böylece Orbtrace'in instance-başına kırılımı "(bilinmiyor)"e çökmek yerine çözülür.attributes/cardinality_denylist+transform/cardinality_safety— kullanıcı-başına etiket adlarını siler ve UUID-biçimli değerleri katlar, böylece metrikler sınırsız zaman serisine patlamaz.transform/log_timestamp_fix— bozuk SDK'lardan gelen sıfır zaman damgalarını doldurur, böylece tek bir bozuk SDK tüm log batch'lerini reddedemez.
Orbtrace'in dokunmadığı şeyler
Orbtrace Doris'ten okur. Uygulamalarınızı veya Collector'ınızı sizin için asla yeniden yapılandırmaz — pipeline sizindir. Bu referans config'in ötesindeki tuning (özel processor'lar, çok-gateway fan-out) ayrı bir hizmettir, ön koşul değil.