İçeriğe geç
mcpd
daemon yok

Aktarıcı ve bölgeler

Ajanlarınızın yanında bir collector; bölgeler arasındaki bağlantı ise yeniden denemelerle aşılır.

Aktarıcı nedir

mcpd relay, aynı ikili dosyayı kendisi hiçbir şey saklamayan bir collector olarak çalıştırır. Bir daemon'un kabul ettiği her HTTP alım isteğini kabul eder, isteği diskteki bir biriktirme alanına yazar, göndericiye yanıt verir ve ardından isteği --upstream ile adı verilen daemon'lara gönderir. Hiçbir depo açmaz.

Ajanlarınızın çalıştığı her bölgede bir tane çalıştırın. Böylece bir gönderici birkaç milisaniye uzaklıktaki bir collector ile konuşur; bölgeler arasındaki bağlantıyı da her ajan kendi başına değil, aktarıcı yeniden denemelerle aşar.

iki üst sunuculu bir kenar aktarıcısı

mcpd relay \ --ingest-key $INGEST_KEY \ --upstream http://mcpd.eu.internal:4317 \ --upstream http://mcpd.us.internal:4317
aktarıcı
$ MCPD_UPSTREAMS=http://mcpd.eu.internal:4317,http://mcpd.us.internal:4317 mcpd --data /data/mcpd.db config | grep ^relayrelay           2 upstream(s) in order, http://mcpd.eu.internal:4317, http://mcpd.us.internal:4317; each sender's key passed on; spool at /data/mcpd.spool/relay, 1024 MiB$ curl -s -D - -o /dev/null localhost:4317/v1/ingest -H "content-type: application/json" -d @batch.json | grep -e ^HTTP -e mcpd-relayHTTP/1.1 202 Acceptedmcpd-relay: spooled$ curl -s localhost:4317/v1/ingest -H "content-type: application/json" -d @batch.json{"accepted":0,"duplicate":0,"rejected":0}

Ne yanıt verir

Yoklama yolları dışındaki her yola gelen her POST kabul edilir. OTLP yolları /v1/traces, /v1/logs ve /v1/metrics, bir OpenTelemetry exporter'ının beklediği gibi, OTLP partialSuccess ile 200 döner. Diğer her yol mcpd-relay: spooled başlığı ve {"accepted":0,"duplicate":0,"rejected":0} gövdesiyle 202 döner: istek tutulmuştur ve teslim edilecektir; gerçek sayılar ise onu henüz görmemiş olan üst sunucuya aittir. Her SDK herhangi bir 2xx yanıtını başarı sayar.

Aktarıcı --ingest-key değerini herhangi bir şey yazmadan önce kendisi denetler ve --max-body-bytes ile --request-timeout-seconds ayarlarını bir daemon gibi uygular. Yanıt gönderilmeden önce istek biriktirme alanındadır: <spool-dir>/relay.

Teslim ve yedeğe geçiş

Biriktirme alanını dört işçi gönderir. Her istek, --upstream sırasında soğuma süresinde olmayan ilk üst sunucuya gider. Yeniden denenebilir bir hata o üst sunucuyu geri çekilme ve rastgele sapmayla ya da Retry-After ne kadar diyorsa o kadar süre soğumaya alır ve istek hemen sonraki üst sunucuya gider. Soğuma bittiğinde önce yine birincil denenir; böylece trafik kendiliğinden ona döner.

400 gibi kesin bir ret sonraki üst sunucuya gönderilmez: sonraki de aynı baytları reddederdi. İstek biriktirme dizinindeki dead/ içine taşınır ve sayılır.

Çift sayım yok

Teslim en az bir kezdir ve yeniden gönderilen bir istek bir kez saklanır. Her istek bir Idempotency-Key başlığı taşır: gönderici bir tane gönderdiyse onunkini, yoksa relay- ve ardından yolun, içerik kodlamasının ve gövdenin özetini. Daemon'daki her alım kapısı bu başlığı dikkate alır; yerel bir yığın gövdesindeki anahtar ise ondan üstündür. Aktarıcının bir zaman aşımından sonra yeniden gönderdiği ya da birincil isteği alıp yanıt kaybolduktan sonra ikincile gönderdiği bir istek tanınır ve yinelenen olarak bildirilir.

Anahtarlar

--upstream-key verildiğinde aktarıcı bu anahtarı her üst sunucuya Bearer belirteci olarak sunar. Verilmediğinde göndericinin Authorization veya x-mcpd-key başlığı, biriktirilen istekle birlikte yalnızca aktarıcının kullanıcısının okuyabildiği bir dosyada tutulur ve iletilir. İkinci biçim, her göndericinin projesini ve kapsamını üst sunucunun gördüğü hâliyle korur.

Geri basınç ve hazır olma

Biriktirme alanı --spool-max-bytes ile sınırlıdır; siz ayarlamadıkça aktarıcı için 1 GiB. Dolduğunda bir istek 503 ve Retry-After: 5 ile reddedilir. Her SDK ve OpenTelemetry exporter'ı bunu yeniden dener; böylece aktarıcı veriyi düşürmez, veriyi gönderici tutar.

/healthz her zaman 200 döner. /readyz şunları döner:

  • bir üst sunucuya erişilebildiği sürece 200 ok;
  • son 30 saniyede hiçbir üst sunucu /readyz yoklamasına yanıt vermediğinde ya da bir teslim almadığında, bir detail ile 200 degraded. Üst sunucular 5 saniyede bir yoklanır;
  • biriktirme alanı dolduğunda ya da hiçbir üst sunucuya erişilemiyor ve biriktirme alanı en az %80 doluyken 503.

Bu yüzden bir yük dengeleyici, tamponlama yapan bir aktarıcıya göndermeyi sürdürür ve artık alamayan bir aktarıcıdan trafiği uzaklaştırır.

Aktarıcı metrikleri

MetrikTürAnlamı
mcpd_relay_accepted_totalcounterBiriktirme alanına yazılan istekler
mcpd_relay_refused_full_totalcounterBiriktirme alanı dolu olduğu için 503 ile reddedilen istekler
mcpd_relay_failovers_totalcounterİlki dışında bir üst sunucuya teslim edilen istekler
mcpd_relay_dead_letter_totalcounterBir üst sunucunun kesin olarak reddettiği ve dead/ içine taşınan istekler
mcpd_relay_spool_entriesgaugeBiriktirme alanında bekleyen istekler
mcpd_relay_spool_bytesgaugeBiriktirme alanının tuttuğu bayt
mcpd_relay_spool_oldest_secondsgaugeBekleyen en eski isteğin yaşı ya da 0
mcpd_relay_delivered_totalcounterBir üst sunucunun kabul ettiği istekler; upstream ve order etiketleriyle
mcpd_relay_failed_attempts_totalcounterBir üst sunucunun kabul etmediği girişimler; aynı etiketlerle
mcpd_relay_upstream_upgaugeÜst sunucu son 30 saniyede yanıt verdiyse 1, aksi hâlde 0
mcpd_uptime_secondsgaugeBu süreç başladığından beri geçen saniye

Artan bir mcpd_relay_failovers_total, birincilin başarısız olduğunu ve trafiğini ikincilin taşıdığını gösterir. mcpd_relay_spool_oldest_seconds, teslimin ne kadar geride olduğunu gösterir.

Birden çok bölge

Bir veya daha fazla bölgede, tek bir Postgres ya da ClickHouse deposuna bağlı birkaç daemon kopyası çalıştırın; çalıştırmalar Postgres'te (--runs-data postgres://...) olsun ya da kapalı olsun: gömülü bir çalıştırma deposu tek bir sürece aittir. Her kopyanın /readyz yanıtı depoya erişip erişemediğini zaten yansıtır. Her bölgede bunların önüne bir aktarıcı koyun; --upstream listesinde önce en yakın daemon'u, ikinci olarak da başka bir bölgedeki bir daemon'u verin.

Birden fazla kopya olduğunda dört ayar farklı davranır:

  • Idempotency anahtarları ortak depoda tutulur; bu yüzden başka bir kopyaya düşen yeniden gönderim de tanınır. Postgres anahtarı yığınla aynı işlemde kaydeder.
  • Dakika başına kota tavanları kopya başına sayılır. İstediğiniz tavanı kopya sayısına bölün.
  • Canlı puanlama, kuyruk örneklemesi ve izleyici uyarıları aynı anda tek bir kopyada çalışır. Kopyalar paylaşılan depodaki bir lease ile sırayla iş alır: lease sahibi onu her geçişte yeniler, kapanırken bırakır ve durursa üç geçiş içinde başka bir kopya devralır. Her kopya kendi izleyicilerini ve SLO hedeflerini değerlendirir, bu yüzden her biri izleyici API'sine yanıt verir; webhook'u yalnızca lease sahibi gönderir. Onları her kopyada aynı şekilde yapılandırın.
  • Yön analizi, yapılandırıldığı her kopyada çalışır. Onu tek bir kopyada yapılandırın.

Örnek kurulumlar

deploy/docker/docker-compose.multi-region.yml tek bir makinede Postgres, iki daemon ve bir aktarıcı başlatır; bu, topolojinin tamamını deneyebileceğiniz bir biçimde sunar.

Helm chart'ı mode: relay değerini alır. deploy/helm/examples/ altındaki üç değer dosyası her biri bir bölgeyi tanımlar: region-core.yaml, region-standby.yaml ve region-edge-relay.yaml; sonuncusu yalnızca bir aktarıcı çalıştıran bir bölge içindir.

Sonraki