Sürüm: 0.21.0Bu dokümantasyon Spitfire 0.21.0 içindir.
gRPC
Ne işe yarar
gRPC adımı bir gRPC servisinin metodunu çağırır: unary (tek istek, tek yanıt), server streaming, client streaming ve bidirectional (bidi) streaming. İstek mesajını JSON olarak yazarsınız; Spitfire şemayı kullanarak onu protobuf'a çevirir. Şema iki yerden gelir: sunucunun server reflection servisi ya da bağlantıya yüklediğiniz .proto dosyaları.
Ne zaman kullanılır
- Mikroservisleriniz birbirleriyle gRPC üzerinden konuşuyorsa ve bir servisin yük altındaki gecikmesini ölçmek istiyorsanız.
- Streaming metotlarda ilk mesaja kadar geçen süreyi, mesaj başına gecikmeyi ve mesajlar arası süreyi görmek istiyorsanız.
Bağlantı oluşturma
- Bağlantılar → Bağlantı ekle'ye tıklayın, Tür olarak gRPC seçin.
- Ad verin (ör.
orders-grpc). - Adres (host:port) alanına servisin adresini yazın, örneğin
orders.internal:50051. Zorunludur. - Gerekirse:
- Authority:
:authorityheader'ı adresten farklı olmalıysa (ör. bir proxy arkasında sanal host). - Bearer token: her çağrıda
authorization: Bearer <token>metadata'sı olarak gönderilir. Secret'tır. - Her VU ayrı bağlantı: her VU kendi HTTP/2 bağlantısını açar.
- Paylaşılan bağlantı sayısı (runner başına): Her VU ayrı bağlantı kapalıyken bir runner'daki VU'lar bu kadar bağlantıyı paylaşır (varsayılan 8). Tek bir bağlantı, sunucunun eşzamanlı stream sınırına (çoğu zaman 100–128) takılıp beklemeyi gecikme olarak sayar ve L4 yük dengeleyicinin arkasında bütün çağrıları tek backend'e gönderir; bu yüzden birden çok bağlantı kullanılır.
- Authority:
- Şema kaynağı:
- Sunucuda reflection açıksa hiçbir şey yüklemeyin; listede Şema server reflection ile alınır. görünür.
- Reflection kapalıysa .proto dosyaları alanından servisin
.protodosyalarını, import ettikleriyle birlikte seçin (birden çok dosya seçebilirsiniz). Controller bunları kaydederken derler; derleme hatası varsa kayıt reddedilir ve hata gösterilir.
- TLS gerekiyorsa TLS bölümünü açıp TLS kullan'ı işaretleyin (bkz. TLS ayarları).
- Kaydet, ardından Test et.
Adım ekleme
- Test editöründe Adım ekle → Protokol olarak gRPC seçin.
- Bağlantı listesinden gRPC bağlantınızı seçin.
- Metot listesi şemadan doldurulur (Metot seçin…). Streaming metotların yanında türü yazar: server stream, client stream ya da bidi stream. Şema okunamazsa Şema okunamadı; metodu elle yazın çıkar; metodu
paket.Servis/Metotbiçiminde yazın (ör.shop.v1.Orders/GetOrder). - İstek mesajı (JSON) alanına mesajı yazın. Şablonu doldur düğmesi seçili metodun alanlarıyla boş bir JSON iskeleti yerleştirir. Alanlarda
{{değişken}}kullanabilirsiniz. - Gerekirse Metadata ekleyin (ör.
x-tenant: demo). - Streaming metotta stream ayarlarını yapın (aşağıda).
- Check sekmesinde durumu doğrulayın: Durum check'i gRPC status adını (
OK,NOT_FOUND, büyük/küçük harf fark etmez) ya da sayısal kodunu kabul eder. - Dene ile tek iterasyon gönderin, Kaydet.
{"id": "get-order", "name": "Sipariş getir", "protocol": "grpc", "connection": "orders-grpc",
"grpc": {"method": "shop.v1.Orders/GetOrder", "message": "{\"id\": \"{{$uuid}}\"}",
"metadata": [{"key": "x-tenant", "value": "demo"}]},
"checks": [{"type": "status", "value": "OK"}]}Streaming ayarları
Streaming bir metot seçtiğinizde Streaming metot bölümü açılır. Bir adım bir stream'dir.
| Ayar | Açıklama |
|---|---|
| Gönderilecek mesajlar | Client ve bidi streaming'de: Mesajı tekrarla (aynı mesaj Adet kez; {{__MSG}} mesajın sırasıdır, 0'dan başlar) ya da Mesaj listesi (Mesaj ekle ile sırayla gönderilecek mesajlar). Server streaming mesajı bir kez gönderir. |
| Mesajlar arası bekleme | İki mesaj arasında beklenen süre (ör. 100ms). |
| Son mesajdan sonra gönderim tarafını açık tut | Bidi'de: client kendi tarafını kapatınca stream'i bitiren sunucular için. Bu durumda yanıt sayısı ya da süre verin. |
| Beklenecek yanıt sayısı | Bu kadar yanıt gelince stream biter. Boşsa sunucu stream'i bitirene kadar beklenir. Sunucu bu sayıya ulaşmadan biterse adım incomplete hatasıyla başarısız olur. |
| Stream süresi | Bu süre dolunca client stream'i kapatır; hata sayılmaz. |
| Timeout (deadline) | Varsayılan: testin istek zaman aşımı artı adımın gönderim süresi. Aşılırsa DEADLINE_EXCEEDED hatası. |
| Kontrollerin ve değişken çıkarmanın gördüğü | son yanıt (varsayılan) ya da tüm yanıtlar, JSON dizisi olarak ($[0].id, $[9].text…). |
On mesaj gönderen, on yanıt bekleyen ve onuncu yanıtı doğrulayan bir bidi stream:
{"id": "chat", "name": "Chat", "protocol": "grpc", "connection": "orders-grpc",
"grpc": {"method": "shop.v1.Chat/Talk", "message": "{\"text\": \"selam {{__MSG}}\"}",
"stream": {"count": 10, "interval": "100ms", "receive": 10, "body": "all"}},
"checks": [{"type": "jsonPath", "path": "$[9].text", "value": "selam 9"}]}Gönderilen ve alınan mesaj sayıları grpc-messages-sent / grpc-messages-received header'larında da bulunur; check'lerde kullanabilirsiniz.
Ürettiği metrikler
| Metrik | Unary | Streaming | Anlamı |
|---|---|---|---|
req_duration |
Evet | Evet | Unary'de çağrının süresi; streaming'de tüm stream |
req_failed |
Evet | Evet | gRPC status OK olmayan çağrıların oranı |
grpc_time_to_first_message |
Evet | Stream açılışından ilk yanıta kadar | |
grpc_message_latency |
Bidi | Her yanıt, yanıtlanmamış en eski mesajla eşleştirilir; her mesaja sırayla yanıt veren sunucular için doğrudur | |
grpc_message_gap |
Evet | Eşleşecek mesajı olmayan yanıtlar (server streaming, fazladan push) için bir önceki yanıttan bu yana geçen süre | |
grpc_messages_sent, grpc_messages_received |
Evet | Sayaçlar |
Koşu sayfasında streaming adımlar gRPC stream'leri tablosunda (Gönderilen mesaj, Alınan mesaj, İlk mesaj p95, Mesaj gecikmesi p95, Mesajlar arası p95) görünür. Eşik örneği: {"metric": "grpc_time_to_first_message", "expr": "p(95)<300"}.
Sık karşılaşılan sorunlar
Belirti: Metot listesi boş, Şema okunamadı; metodu elle yazın ya da gRPC şeması alınamadı.
Neden: Sunucuda server reflection kapalı ve bağlantıya .proto yüklenmemiş; ya da adres/TLS ayarı yanlış olduğu için controller sunucuya ulaşamıyor.
Çözüm: Önce Test et ile bağlantıyı doğrulayın. Bağlantı yeşilse .proto dosyaları'nı import ettikleriyle birlikte yükleyin.
Belirti: .proto yüklerken kayıt reddediliyor, mesajda not found / could not resolve import.
Neden: Bir import edilen dosya eksik.
Çözüm: Import zincirindeki tüm dosyaları (ör. ortak common.proto) birlikte seçin.
Belirti: Unavailable, connection refused ya da transport: authentication handshake failed.
Neden: Port yanlış, servis kapalı ya da TLS ayarı sunucuyla uyuşmuyor (TLS'li sunucuya düz bağlantı veya tersi).
Çözüm: Adres (host:port)'u ve TLS kullan kutusunu kontrol edin; özel CA için CA sertifikası ekleyin.
Belirti: UNAUTHENTICATED ya da PERMISSION_DENIED.
Neden: Token eksik ya da yanlış.
Çözüm: Bearer token'ı yeniden yazıp kaydedin veya adımın Metadata alanında doğru header'ı gönderin.
Belirti: Streaming adımda DEADLINE_EXCEEDED.
Neden: Stream, timeout dolmadan bitmedi (sunucu stream'i kapatmıyor ya da yanıtlar yavaş).
Çözüm: Beklenecek yanıt sayısı ya da Stream süresi verin; gerekirse Timeout (deadline)'ı artırın.
Belirti: Adım incomplete hatasıyla başarısız.
Neden: Sunucu, Beklenecek yanıt sayısına ulaşmadan stream'i bitirdi.
Çözüm: Sayıyı sunucunun gerçekten gönderdiği yanıt sayısına göre düzeltin ya da alanı boş bırakın.
Belirti: Yük arttıkça p95 basamak basamak yükseliyor, sunucu CPU'su düşük. Neden: Çok sayıda VU az sayıda HTTP/2 bağlantısını paylaşıyor ve sunucunun stream sınırında bekliyor. Çözüm: Paylaşılan bağlantı sayısı (runner başına)'nı artırın ya da Her VU ayrı bağlantı'yı işaretleyin.