Orbtrace

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

checkout-apiOTel SDK
orders-workerOTel SDK
web-frontendOTel SDK

loglar · izler · metrikler

OTLP4317 · 4318

OpenTelemetry Collector

Standart upstream imaj — biz config veririz, siz çalıştırırsınız.

ReceiversTüm uygulamalarınızdan OTLP kabul et — gRPC 4317, HTTP 4318.
ProcessorsBatch'le, retry yap, tail-sample uygula, kardinaliteye karşı koru.
ExportersHer sinyali Stream Load ile Apache Doris'e yaz.
yaz

Orbtrace (ürün)

Apache DorisLoglar, izler ve metrikler için tek veritabanı.
oku
Orbtrace server + UIDoris'i okur ve gördüğünüz her ekranı çizer.

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 doris exporter'ı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: false ile çalışmalıdır — bu en sık yapılan hatadır, aşağıda ayrıntılı.

Hangi desen size uyar?

Elinizde…KullanınTek cümlede
Henüz Collector yokDesen ATek container çalıştırın. Bir dakikada biter.
Mevcut bir OTel Collector / pipeline varDesen BTek 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. 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 paketinizin compose/ dizininde gelir. Paket ücretsiz bir public download'dur.

    Paketi indirin, açın ve compose/ dizinine cd yapın — otelcol-config.yaml oradadır.

  2. 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. 3

    Uygulamalarınızı ona yönlendirin

    Her servisin OTEL_EXPORTER_OTLP_ENDPOINT değ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:

  1. Collector'ınız contrib build olmalı. doris exporter yalnızca otel/opentelemetry-collector-contrib içinde gelir.
  2. Her Doris exporter create_schema: false ile ç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:

otelcol-config.yaml (mevcut Collector'ınıza ekleyin)
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ığı:

AlanNedirNotlar
endpointDoris FE HTTP adresi, port 8030Stream Load batch'lerinin POST edildiği yer.
databaseOrbtrace veritabanı adıorbtrace.
username / passwordDoris girişiTaze paketlenmiş Doris root'u boş parolayla çalışır. Üretimde parola belirleyin.
tableSinyali tablosuna eşlerotel_traces / otel_logs / otel_metrics.
create_schemaExporter tablo oluşturur muOrbtrace 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.

İzlerLoglarMetrikler
Tablootel_tracesotel_logsotel_metrics_* (beş)
Tablo modeliDUPLICATE KEYDUPLICATE KEYDUPLICATE KEY
DağıtımRANDOMRANDOMRANDOM
load_to_single_tablet"true""true""false"
Göreli hacimYüksekYüksekDüşük
Kuyruk derinliği (üretim)En derinOrtaSığ

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-01 iç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_BELOW ile ayarlayın (bir OTTL severity sabiti, varsayılan SEVERITY_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.

Önerilen üretim exporter'ları — izler, loglar VE metrikler
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:

Ayardoris/tracesdoris/logsdoris/metricsNeden
num_consumers20105Her sinyalin hacmiyle ölçekleyin — izler en ağırı.
queue_size1000500200Ağı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ÖnerilenNe zaman değiştirilir
send_batch_size / _max_size100000 / 200000Sessiz 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.timeout5sDüşük hacimde veriyi daha erken görmek isterseniz düşürün (örn. 1s).
timeout (Stream Load)300sNadiren. 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_consumers20 / 10 / 5Alı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_size1000 / 500 / 200Daha 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_time30sBırakın. Daha uzunu, yüklenmeyecek veride bir consumer'ı meşgul eder.
log_responsetrueAçı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'ına group_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_mode bir 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ılan streaming_load_json_max_mb tavanının altında tutun.
  • Kuyruk derinliği ve consumer'lar. Daha derin queue_size daha uzun Doris kesintilerini tamponlar; daha fazla num_consumers yazma 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
OTLP4317 · 4318

Tek Collector

  • :4317 / :4318 üzerinden OTLP alır
  • tail_sampling + batching
  • Dayanıklı disk üstü gönderme kuyruğu
Stream Load

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
OTLP

Gateway katmanıDeployment — 2+ replika

  • tail_sampling (bir izin tüm span'leri)
  • doris/* exporter'lar + dayanıklı kuyruk
  • Doris kimlik bilgilerini tutar
Stream Load

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, k8sattributes processor'ı 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: traceID ile loadbalancing yaparak 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 Instrumentation CRD'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-v2 SCC altında çalışır. Gateway'in kuyruk volume'una securityContext.fsGroup: 10001 ile 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_idservice.instance.id'yi k8s.pod.name veya host.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.