Ortak İşlemler
- Yapılandırma
- Genel
- Go Collector Nasıl Kullanıma Hazırlanacak?
- Go Collector Olanağının bir hazırlık algılayıcısına nasıl dahil edileceği?
- Kapanıştan önce tüm izleme verilerinin gönderildiğinden nasıl emin olunur?
- Go Collector olanağını sunucusuz bir ortamda çalışacak şekilde nasıl yapılandırılır?
- Hassas verileri düzeltilemek için Go Collector olanağını nasıl yapılandırırsınız?
- Ek HTTP üstbilgileri nasıl toplanır?
- Günlüğe Kaydetme
- Instana AutoProfile™
- Genel
- Özel İşlemden Geçirme
Yapılandırma
Genel
Go Collector olanağının kullanıma hazırlanması nasıl yapılır?
Bir *instana.Options yapılandırma nesnesi sağlayarak main() işlevinizin başında Go Collector çağrısını instana.InitSensor() başlatmak için:
import instana "github.com/instana/go-sensor"
func main() {
instana.InitSensor(&instana.Options{
// ...
})
// ...
}
Go Collector, instana.InitSensor() işlevine sağlanan yapılandırma nesnesinin kullanıma hazırlanmamış alanları için instana.DefaultOptions() değerlerini kullanır.
Not: Bu, Go hizmetinizin instana kullanıcı arabiriminde görünmesini ve çalıştırma zamanı ölçümlerini raporlayacaktır. İzleme bilgilerini görmek için önce uygulama kodunuza izleme kodu eklemelisiniz.
Go Collector olanağının bir hazırlık araştırmasına nasıl dahil edileceği?
Go Collector olanağının duyuru sürecini tamamladığından ve trafiği bir eşgörünüme göndermeden önce izleme toplamaya hazır olduğundan emin olmak için instana.Ready() yöntemini kullanın:
// Every 100ms whether Go Collector is ready and return on success
func awaitInstanaReady(ctx context.Context) error {
ticker := time.NewTicker(100*time.Millisecond)
defer ticker.Stop()
for {
select {
case <-ticker.C:
if instana.Ready() {
return nil
}
case <-ctx.Done():
return ctx.Err()
}
}
return nil
}
Kapanıştan önce tüm izleme verilerinin gönderildiğinden nasıl emin olunur?
Toplanan tüm izlemelerin anasistem aracısına ya da sunucusuz alıcıya gönderildiğinden emin olmak için Go Collector API 'si instana.Flush() yöntemini sunar. Bu yöntem, aracı istemcisini arabelleğe alınan tüm verileri hemen göndermeye zorlar. Bu bir engelleyici işlemdir ve bu işlem için bir zamanaşımı ya da son tarih tanımlanması önerilir; böylece, hizmetiniz zarif bir şekilde çıkabilir:
func main() {
var srv http.Server
// Initialize and use http.Server
// ...
// Server shutdown sequence:
// 1. Finalize all pending requests and close the server
shutdownCtx, _ := context.WithTimeout(ctx, 5 * time.Second)
if err := srv.Shutdown(shutdownCtx); err != nil {
// ...
}
// 2. Flush all buffered traces to the agent
flushCtx, _ := context.WithTimeout(ctx, 5 * time.Second)
if err := instana.Flush(flushCtx); err != nil {
// ...
}
// ...
}
AWS Lambda instana.Flush() üzerinde çalışan bir hizmet, işleyici yapıldıktan sonra Go Collector tarafından otomatik olarak çağrılır, bu nedenle bunu el ile yapmanıza gerek yoktur.
Not: instana.Flush() , Go Collector olanağının veri iletim çevrimini etkileyebilir ve bunun kullanılması, hizmet süresi boyunca (örneğin, bir HTTP isteğinin sunulması sona erdikten sonra) izleme verilerinin teslimini etkilemesi önerilmez. Go Collector olanağının bu yöntemi çağırdıktan sonra çalışır durumda kalacağı garanti verilmez.
Go Collector olanağının sunucusuz bir ortamda çalışacak şekilde yapılandırılması?
AWS Fargate ya da Google Cloud Run gibi bir sunucsuz ortamda çalışan bir hizmeti izlemek üzere Go Collector olanağını kullanmak için, görev tanımlamanızda INSTANA_ENDPOINT_URL ve INSTANA_AGENT_KEY ortam değişkenlerinin ayarlandığından emin olun. Bunun nasıl gerçekleştirileceğine ilişkin ayrıntılı açıklamalar için lütfen YönOrtamıana belgelerinin ilgili bölümüne bakın:
- AWS Fargate görev tanımlamalarının yapılandırılması
- AWS Lambda işlevlerinin yapılandırılması
- Google Cloud Çalıştırma hizmetlerini yapılandırma
Not: Bir uygulama sunucsuz kipte çalışırken INSTANA_AGENT_HOST ve INSTANA_AGENT_PORT ortam değişkenleri yoksayılır.
Sunucsuz ortamlarda çalışan hizmetler, metrikleri ve izleme verilerini instana arka ucuna göndermek için anasistem aracısını kullanmaz; bu nedenle, uygulama içi toplayıcıyı configuration.yaml dosyası aracılığıyla yapılandırmanın olağan yolu geçerli değildir. Bunun yerine, hizmet görevi tanımlamasında isteğe bağlı olarak yapılandırılabilen bir ortam değişkenleri kümesi vardır:
| Ortam değişkeni | Varsayılan değer | Açıklama |
|---|---|---|
INSTANA_TIMEOUT |
500 |
Instana arka uç bağlantısı zamanaşımı (milisaniye) |
INSTANA_SECRETS |
contains-ignore-case:secret,key,password |
Sırlar süzgeci (süreç ortamı değişkenlerine de uygulanır) |
INSTANA_EXTRA_HTTP_HEADERS |
yok | Gelen isteklerden toplanacak HTTP üstbilgilerinin noktalı virgülle ayrılmış listesi |
INSTANA_ENDPOINT_PROXY |
yok | Instana arka ucuna bağlanmak için kullanılacak yetkili sunucu URL 'si |
INSTANA_TAGS |
yok | ECS göreviyle ilişkilendirilecek isteğe bağlı değerlere sahip etiketlerin virgülle ayrılmış listesi |
INSTANA_ZONE |
<Current AWS availability zone> |
Bu hizmet için özel bir İçgüdü bölgesi adı |
Bu değişkenlerin ve değer biçimlerinin daha ayrıntılı açıklamaları için lütfen YönOrtamıana belgelerine bakın.
Go Collector olanağının hassas verileri düzeltacak şekilde yapılandırılması
Instana tarafından sağlanan bazı kod değişikliği sarıcıları (HTTP sunucusu ve istemci sarıcıları), parolalar, anahtarlar ve güvenlik dizgileri gibi hassas bilgiler içerebilecek verileri toplar. Bu değerlerin sızdırılmasını önlemek için, Go Collector aracıya göndermeden önce bunları <redacted> ile değiştirir. Parametre adı eşleştiricileri listesi, Host Agent Configuration dosyasının com.instana.secrets bölümünde tanımlanır ve duyuru aşamasında uygulama içi izleyiciye gönderilir (Agent Go izleme eklentisi com.instana.sensor-golang-trace v1.3.0 ve üstünü gerektirir).
Güvenlik sırları eşleştiricisi için varsayılan ayar, şu terimler listesiyle contains-ignore-case ' dir: key, password, secret. Bu, vakayı yoksayan bu dizgilerden herhangi birini içeren bir değiştirgenin değerini düzeltir.
Ek HTTP üstbilgileri nasıl toplanır?
HTTP özel işlemden geçirme sarıcıları HTTP üstbilgilerini toplayabilir ve bunları gelen ya da giden istek yayılımıyla birlikte gönderebilir. Büyük ve küçük harfe duyarsız üstbilgi adları listesi, instana.InitSensor() olanağına ve Anasistem Aracısı Yapılandırma dosyasınageçirilen seçenekler nesnesinin (instana.Options).Tracer.CollectableHTTPHeaders alanı içinde sağlanabilir. İkinci ayar önceliklidir ve Agent Go izleme eklentisi com.instana.sensor-golang-trace v1.3.0 ya da sonraki sürümleri gerektirir:
instana.InitSensor(&instana.Options{
// ...
Tracer: instana.TracerOptions{
// ...
CollectableHTTPHeaders: []string{"x-request-id", "x-loadtest-id"},
},
})
Bu yapılandırma, Host Agent Configuration file(Anasistem Aracısı Yapılandırma Dosyası) içindeki aşağıdaki ayarların eşdeğeridir:
com.instana.tracing:
extra-http-headers:
- 'x-request-id'
- 'x-loadtest-id'
Varsayılan olarak, HTTP özel işlemden geçirme herhangi bir üstbilgi toplamaz.
Günlük Kaydı
Go Collector, iç hataları ve tanılama bilgilerini günlüğe kaydetmek için eğimli bir kaydedici kullanır. Varsayılan github.com/instana/go-sensor/logger.Logger , arka uç olarak log.Lstdflags ile yapılandırılmış log.Logger öğesini kullanır ve iletileri os.Stderr' e yazar.
Go Collector günlüklerini yazdırmak için 3rd-party kaydedicisi nasıl kullanılır?
Go Collector olanağını, instana.LeveledLogger arabirimine uyan bir üçüncü taraf kaydedici kullanacak şekilde yapılandırabilirsiniz. Örneğin, github.com/sirupsen/logrus ya da go.uber.org/zapiçin [ instana.SetLogger()] [instana.SetLogger] yöntemini kullanın:
import (
"github.com/uber-go/zap"
instana "github.com/instana/go-sensor"
)
func main() {
logger, _ := zap.NewProduction()
defer logger.Sync()
instana.SetLogger(logger)
}
Not: INSTANA_DEBUG ortam değişkeninin 3rd-party kaydedicisi kullanılırken etkisi yoktur. Hata ayıklama düzeyinin bir ortam değişkeni ya da yapılandırma dosyası aracılığıyla nasıl ayarlanacağını öğrenmek için 3rd-party kaydedici modülünüze ilişkin belgelere bakın.
Uygulama kodunu değiştirmeden Go Collector için hata ayıklama günlükleri nasıl etkinleştirilecek?
Uygulama kodunu değiştirmeden Go Collector olanağının hata ayıklama günlüklerini yazmasını etkinleştirmek için, INSTANA_DEBUG ortam değişkenini boş olmayan bir değere ayarlayın; örneğin:
export INSTANA_DEBUG=true
./your-app
Go Collector olanağının ürettiği hata ayıklama günlüklerinin miktarı uygulamanıza bağlıdır ve önemli olabilir. YönOrtamıAna Desteği' ne bir sorun bildirmeden önce bilgi toplamak için hata ayıklama günlüklerini geçici olarak açmanız önerilir.
Not: Bu ayar, Go Collector iç günlük iletilerinin çıkışını yapmak için logger.Logger kullanıyorsa çalışır ve günlük düzeyini uygulama kodundan değiştirme girişimini geçersiz kılar.
Hatalı çağrılarla ilişkili günlüğe kaydedilen hatalar ve uyarılar nasıl toplanır?
Instana Go Collector, github.com/sirupsen/logrus olanağının hata ve uyarı günlüğü kayıtlarını otomatik olarak toplaması ve aracıya göndermesi için bir izleme kodu ekleme sarıcısı sunar. github.com/instana/go-sensor/instrumentation/instalogrus , hata ya da uyarı kayıtlarını işleyen ve bunları context.Contextkaydında bulunan aralıkla ilişkilendiren bir logrus.Hook uygulaması sağlar. Aşağıda, genel logrus.Logger' e nasıl izleme kodu ekleneceğine ve bunu izleme kodu eklenmiş http.Handleriçinde nasıl kullanacağına ilişkin bir örnek verilmiştir:
func main() {
// ...
// Register instalogrus hook within the global logger
logrus.AddHook(instalogrus.NewHook(sensor))
}
func myMethod(w http.ResponseWriter, req *http.Request) {
// ...
// When logging an error, make sure to provide the context.Context containing
// an active span, so that instrumentation hook could associate this message
// with a call.
logrus.WithContext(req.Context()).Error("something went wrong")
// ...
}
Daha ayrıntılı örnekler için paket belgelerine bakın.
Instana AutoProfile™
Instana AutoProfile™ , profilleri oluşturur ve bunları YönOrtamıana 'ya raporlar. Bir kullanıcının profil oluşturmayı el ile başlatması gereken geliştirme zamanı ve isteğe bağlı profilleyicilerden farklı olarak, kritik üretim ortamlarına uygun profil oluşturmayı otomatik olarak zamanlar ve sürekli olarak gerçekleştirir.
Uygulama kodundan sürekli profil oluşturmayı kalıcı olarak nasıl etkinleştirebilirsiniz?
Hizmetinize ilişkin sürekli profil oluşturmayı kalıcı olarak etkinleştirmek için algılayıcıyı başlatırken EnableAutoProfile: true sağlayın:
func main() {
instana.InitSensor(&instana.Options{
EnableAutoProfile: true,
// ... other options
})
// ...
}
Sürekli profil oluşturmanın uygulama kodundan geçici olarak nasıl etkinleştirileceği/devre dışı bırakılması?
Kodunuzun AutoProfile™ ürününü geçici olarak açıp kapatmak için autoprofile.Enable() ve autoprofile.Disable()' yi arayın:
func expensiveCalculation() {
autoprofile.Enable()
defer autoprofile.Disable()
// ...
}
Uygulama kodunu değiştirmeden sürekli profil oluşturmayı nasıl etkinleştirebilirsiniz?
Kod değişiklikleri olmadan bir uygulama için AutoProfile™ ' ı etkinleştirmek üzere INSTANA_AUTO_PROFILE=true ortam değişkenini ayarlayın:
export INSTANA_AUTO_PROFILE=true
./your-app
Not: Bu değerin öncelikli olduğu INSTANA_DEBUG ile hata ayıklama günlük kaydını etkinleştirmeye benzer ve uygulama kodunun içinden profil oluşturmayı devre dışı bırakma girişimini geçersiz kılar.
Özel İşlemden Geçirme
Uygulama kodunuz, izleme verilerini toplamak ve YönOrtamana 'ya göndermek için değişiklik gerektirir. Bu işleme kod izleme kodu ekleme adı verilir.
Go Collector, koda izleme kodu eklemenin iki seçeneğini sunar:
- Sağlanan kod sarıcıları kullanılıyor. Bu, çok az değişiklik gerektiren kodunuza enstrüman vermenin en kolay yoludur. Instana, veritabanı sürücüleri, HTTP çerçeveleri, vb. gibi en popüler 3rd-party kitaplıkları için özel amaçlı modüller sağlamayı amaçlamaktadır. Henüz karşılık gelen özel işlemden geçirme modülü olmayan bir kitaplık kullanıyorsanız, YönOrtamıAna Fikir gönderimi' ni kullanarak bir özellik isteği dosyalamaya dikkat edin.
- OpenTracing API' nin kullanılması. Kod tabanınızda önemli miktarda değişiklik gerektirebilecek daha düşük düzeyli bir yaklaşım. Ancak aynı zamanda, işe özgü kod parçalarınıza olanak sağlamak konusunda da büyük bir esneklik sağlar.
Lütfen, YönOrtamın çağrıların doğru altyapı ilintilendirmesini ve gösterimini sağlamak için çok özel bir aralık etiketleri kümesi kullandığını unutmayın. İzleme verilerinizden en iyi şekilde yararlanmak için OpenTracing API yaklaşımının yerine sağlanan kod sarıcıları kullanmayı tercih edin. Gerektiğinde, kod sarıcılarını düşük düzeyli yaklaşımla karıştırarak, önceden var olan ve bakımı yapılan koddan yararlanmayı ve aynı zamanda işinize özgü kod parçalarına olanak sağlamak için esnek kalmayı düşünebilirsiniz.
HTTP hizmetleri
Go Collector, net/http paketini kullanan istemciler ve sunucular için özel işlemden geçirme olanağı sağlar. Etkinleştirildikten sonra (aşağıdaki gibi) bu araç, gelen ve giden isteklerle ilgili bilgileri otomatik olarak toplar ve bunları YönOrtamıana aracısına gönderir.
3rd-party HTTP çerçeveleri için özel işlemden geçirme modülleri ayrı Go modülleri olarak sağlanır ve bir HTTP hizmetine izleme kodu eklemenin daha uygun bir yolunu sağlar.
Bir HTTP sunucusu işleyicisine izleme kodu nasıl yapılır?
Bir http.HandlerFuncsarma desteğiyle, YönOrtamıAna istek kapsamı bağlamında yürütülen istekleri izleme ve alt öğe yayımlarını toplama olasılığını hızla ekler.
Instana 'nın gerekli bilgileri alabilmesi için minimum değişiklikler gereklidir. Şu anda var olan http.HandlerFunc YönOrtamı'nını kaydırarak, gerekli bilgileri otomatik olarak toplar ve enjekte eder.
Buna göre, aşağıdakiler gibi basit bir işleyici fonksiyonu, normal gibi kaydırılacak ve kaydedilecektir.
Aşağıdaki örnek kod, instana.TracingHandlerFunc()kullanılarak bir HTTP işleyicisine nasıl izleme kodu eklemeyi gösterir:
sensor := instana.NewSensor("my-http-server")
http.HandleFunc("/", instana.TracingHandlerFunc(sensor, "/", func(w http.ResponseWriter, req *http.Request) {
// ...
}))
İşleyicinizin http.Handlerolarak gerçekleştirilmesi durumunda, bunun yerine ServeHTTP yöntemini geçirin:
h := http.FileServer(http.Dir("./"))
http.HandleFunc("/files", instana.TracingHandlerFunc(sensor, "index", h.ServeHTTP))
Tam örnek için bkz. example/http-database-greeter .
Bir HTTP istemcisine izleme kodu nasıl yapılır?
Genellikle dış sistemlerden veri veya bilgi istemek, HTTP istekleri aracılığıyla yaygın olarak uygulanır. İzlemelerin, özellikle de tüm farklı sistemlerde tüm aralıkları içerdiğinden emin olmak için, belirli yayılma bilgilerinin gönderilmeden önce HTTP istek üstbilgilerine enjekte edilmesi gerekir. Instana 'nın Go Toplayıcısı, bu süreci mümkün olduğunca otomatikleştirmek için destek sağlar.
Instana 'nın istek üstbilgilerine bilgi enjekte etmesi için, http.Clientöğesini oluşturun, Transport öğesini instana.RoundTripper() ile sarın ve aşağıdaki örnekte olduğu gibi kullanın.
req, err := http.NewRequest("GET", url, nil)
client := &http.Client{
Transport: instana.RoundTripper(sensor, nil),
}
ctx := instana.ContextWithSpan(context.Background(), parentSpan)
resp, err := client.Do(req.WithContext(ctx))
Sağlanan parentSpan , istek işleyiciden gelen istektir (yukarıya bakın) ve bir alt öğe kapsamı yaratmak ve bunu isteğe enjekte etmek için gereken izleme ve kapsama bilgilerini sağlar.
Veritabanı istemcileri
Go Collector, database/sqlile yapılan SQL veritabanı çağrılarına izleme kodu eklemek için instana.InstrumentSQLDriver() ve instana.WrapSQLConnector() (Go v1.10+sürümünden bu yana) olanaklarını sağlar. Daha sonra izleyici, Query ve Exec çağrılarını otomatik olarak yakalar, deyim, yürütme süresi gibi sorgu hakkında bilgi toplar ve bunları izlemenin bir parçası olarak görüntülenecek şekilde iletir.
MongoDBgibi bir noSQL veritabanı istemcisine izleme kodu eklemek için, sürücünüz için sağlanan bir özel işlemden geçirme modülü olup olmadığını denetleyin.
sql.Open() ile oluşturulan bir veritabanı bağlantısına izleme kodu nasıl yapılır?
Bir veritabanı sürücüsüne izleme kodu eklemek için, önce instana.InstrumentSQLDriver() komutunu kullanarak kaydettirin ve sql.Open() çağrısıyla instana.SQLOpen()değiştirmesini sağlayın. Aşağıda, github.com/lib/pq PostgreSQL sürücüsü için bunun nasıl yapılacağını gösteren bir örnek verilmiştir:
// Create a new instana.Sensor instance
sensor := instana.NewSensor("my-database-app")
// Instrument the driver
instana.InstrumentSQLDriver(sensor, "postgres", &pq.Driver{})
// Create an instance of *sql.DB to use for database queries
db, err := instana.SQLOpen("postgres", "postgres://...")
İzleme kodu eklenen sürücü <original_name>_with_instanaadıyla kaydedilir; örneğin, yukarıdaki örnekte adın postgres_with_instanaolması gerekir.
Tam örnek için bkz. example/http-database-greeter .
sql.OpenDB() ile oluşturulan bir veritabanı istemcisine izleme kodu nasıl yapılır?
Go v1.10 database/sql sürümünden başlayarak, *sql.DB ' un genel sürücü kaydının kullanılmasını gerektirmeyen yeni bir başlatma yöntemi sağlar. Veritabanı sürücüsü kitaplığı database/sql/driver.Connector arabirimini karşılayan bir tip sağlıyorsa, veritabanı bağlantısı yaratmak için kullanılabilir.
Bir driver.Connector eşgörünümüne izleme kodu eklemek için instana.WrapSQLConnector()komutunu kullanarak sar. Aşağıda, bunun github.com/go-sql-driver/mysql/ MySQL sürücüsü için nasıl yapılabileceğine ilişkin bir örnek verilmiştir:
// Create a new instana.Sensor instance
sensor := instana.NewSensor("my-database-app")
// Initialize a new connector
connector, err := mysql.NewConnector(cfg)
// ...
// Wrap the connector before passing it to sql.OpenDB()
db, err := sql.OpenDB(instana.WrapSQLConnector(sensor, "mysql://...", connector))
Bir MongoDB istemcisine nasıl izleme kodu eklemek istiyorsunuz?
github.com/instana/go-sensor/instrumentation/instamongo modülü, go.mongodb.org/mongo-driver istemcisinin yeni bir eşgörünümünü yaratan ve ona YönOrtamıla izleme kodu ekleyen oluşturucu yöntemleri sağlar.
Ayrıntılı örnekler ve kullanım yönergeleri için paket belgelerine bakın.
Redis istemcisine nasıl izleme yapılır?
github.com/instana/go-sensor/instrumentation/instaredismodülü, redis istemcisine kancalar ekleyerek birredis.Clientya daredis.ClusterClienteşgörünümüne izleme kodu ekleyengo-redisiçin işlev sarıcıları sunar.Ayrıntılı örnekler ve kullanım yönergeleri için paket belgelerine bakın.
github.com/instana/go-sensor/instrumentation/instaredigomodülü, birredis.Conneşgörünümüne izleme kodu ekleyenredigoiçin sarıcılar sunar.Ayrıntılı örnekler ve kullanım yönergeleri için paket belgelerine bakın.
gRPC hizmetleri
github.com/instana/go-sensor/instrumentation/instagrpc modülü, google.golang.org/grpckullanan gRPC sunucularına ve istemcilerine izleme kodu eklemek için hem tekli hem de akış kesicileri sağlar.
Bir gRPC sunucusuna izleme kodu nasıl yapılır?
github.com/instana/go-sensor/instrumentation/instagrpc modülü hem akış hem de birli çağrı engelleyicileri sağlar. Modül belgeleri , google.golang.org/grpcile uygulanan bir gRPC sunucusuna izleme kodu eklemek için bunların nasıl kullanılacağına ilişkin ayrıntılı açıklamalar sağlar.
Tam örnek için bkz. example/grpc-client-server .
Bir gRPC istemcisine izleme kodu nasıl yapılır?
github.com/instana/go-sensor/instrumentation/instagrpc modülü hem akış hem de birli çağrı engelleyicileri sağlar. Modül belgeleri , google.golang.org/grpcile uygulanan bir gRPC istemcisine izleme kodu eklemek için bunların nasıl kullanılacağına ilişkin ayrıntılı açıklamalar sağlar.
Tam örnek için bkz. example/grpc-client-server .
İleti alışverişi hizmetleri
Bir Kafka üreticisine/tüketicisine nasıl araç uygulanır?
github.com/instana/go-sensor/instrumentation/instasarama modülü, üretici/tüketici istemcilerinin yeni bir eşgörünümünü yaratan ve bunu YönOrtamıyla gerçekleştiren oluşturucu yöntemleri sağlar.
Tam örnek için bkz. example/kafka-producer-consumer .
Bir RabbitMQ üreticisine/tüketicisine nasıl izleme yapılır?
github.com/instana/go-sensor/instrumentation/instaamqp modülü, instaamqp.AmqpChannel yönetim ortamı döndüren amqp.Channel çevresinde bir işlev sarıcısı sunar. Bu YönOrtamıana nesnesi, gönderilen ve alınan iletilerden verileri izlemekten sorumlu amqp.Channel.Publish ve amqp.Channel.Consume yöntemleri için özel işlemden geçirme sağlar.
github.com/instana/go-sensor/blob/main/instrumentation/instaamqpadresindeki tam örneğe bakın.
OpenTracing API ile el ile özel işlemden geçirme
Instana Go Collector, github.com/opentracing/opentracing-goile uyumlu bir arabirim sağlar ve genel izleyici olarak kullanılabilir. Ancak, önerilen yaklaşım, sağlanan instana kod sarıcıları' nı kullanmaktır. Çok fazla semantik bilgi kurdular, bu da Instana 'nın uygulamanın mümkün olan en iyi resmini elde etmesine yardımcı oldu. Aramaları altyapıya ilintilendirdiğinizde, doğru etiketlerin gönderilmesi özellikle önemlidir. Bunun nedeni, çoğu etiketin dizgi olması ve bu nedenle hata yapabilmeniz olabilir.
Bir yönteme nasıl izleme kodu yapılır?
Go Collector ile bir yöntemin en düşük düzeyde özel işlemden geçirmesi iki adımdan oluşur:
instana.Sensorile yeni bir aralık başlatın.- Yöntem döndürülmeden önce kapsamı sonlandırın.
İsteğe bağlı adımlar arasında, bu çağrıyı etkin kapsama eklemek için bu çağrıyla ilgili ayrıntıların toplanması ve izleme devamınısağlamak için etkin yayının context.Context içine enjekte edilmesi yer alır.
func MyMethod(sensor *instana.Sensor) {
// Start a new span associated with this method execution
span := sensor.Tracer().StartSpan("my-method")
// Schedule span finalization to send it to Instana agent
defer span.Finish()
// Optionally attach any relevant information that would help you to identify this call later
span.SetTag("key1", "value1")
span.SetTag("answer", 42)
// ...
}
Daha ayrıntılı örnek için bkz. example/opentracing .
İzlemeye bir alt aramanın içinde nasıl devam edilsin?
Bir alt çağrıyı etkin bir kapsamla ilişkilendirmek için, alt çağrı kapsamını başlatırken opentracing.ChildOf() başlangıç kapsamı seçeneği aracılığıyla alt çağrıyı sağlayın:
var spanOpts []opentracing.StartSpanOption
// Check whether there is an active trace by fetching the currently active span from context
if parent, ok := instana.SpanFromContext(ctx); ok {
spanOpts = append(spanOpts, opentracing.ChildOf(parent.Context()))
}
// Start the subcall span
span := tracer.StartSpan("my-func", spanOpts...)
Çağırana sağlanan bir context.Context eşgörünümünün instana.ContextWithSpan()ile verilen etkin aralığı içermesini sağlamak çağıranın sorumluluğundadır:
// And inject it into context, so any subcalls could use it as a parent
SubCall(instana.ContextWithSpan(ctx, span))
Sarmalanmış yöntemin üst kapsamı nasıl elde edilir?
Instana tarafından sağlanan kod sarıcıları, üst öğe aralığını bir alt çağrıya enjekte etmek için context.Context kodunu kullanır. Yani, donanımlı bir işleyici/geri çağırma işlevinin içinde, instana.SpanFromContext() ' ın sarıcı yöntemiyle başlatılan aralığı döndürdüğünü varsayalım:
parentSpan, ok := instana.SpanFromContext(ctx)
Not: Bir 3rd-party , context.Context ' ın işleyici yöntemine geçirilmesini desteklemiyorsa, sarıcı kodu etkin kapsam bağlamını enjekte etmek için alternatif yöntemler kullanabilir. Bu durumda üst kapsam bağlamının nasıl elde edileceğini öğrenmek için ilgili sarıcı modülüne ilişkin belgelere bakın.