Uygulama Analizinde telemetri bağıntısı Analizler

Mikro hizmetler dünyasında her mantıksal işlem, hizmetin çeşitli bileşenlerinde yapılması gereken işlerdir. Application Analizler kullanarak bu bileşenlerin her bir Analizler. Uygulama Analizler, hangi bileşenin hatalardan veya performans düşüşünden sorumlu olduğunu algılamak için kullanabileceğiniz dağıtılmış telemetri bağıntılarını destekler.

Bu makalede, Application Analizler tarafından birden çok bileşen tarafından gönderilen telemetri verileri arasında ilişki için kullanılan veri modeli açıklanmıştır. Bağlam yayma tekniklerini ve protokollerini kapsar. Ayrıca farklı dillerde ve platformlarda bağıntı taktiklerinin uygulanmasını da kapsar.

Telemetri bağıntısı için veri modeli

Uygulama Analizler, dağıtılmış telemetri bağıntısı için bir veri modeli tanımlar. Telemetri verileri bir mantıksal işlemle ilişkilendirmek için her telemetri öğesinin adlı bir bağlam alanı operation_Id vardır. Bu tanımlayıcı, dağıtılmış izlemede yer alan her telemetri öğesi tarafından paylaşılır. Dolayısıyla tek bir katmandan telemetri kaybede bile diğer bileşenler tarafından bildirilen telemetrileri ilişkilendirmeye devam edersiniz.

Dağıtılmış mantıksal işlem genellikle bileşenlerden biri tarafından işlenen istekler olan daha küçük işlemler kümesinden oluşur. Bu işlemler, istek telemetrisi tarafından tanımlanır. Her istek telemetri öğesinin benzersiz id ve genel olarak tanımlayan kendi telemetri öğesi vardır. Ayrıca istekle ilişkili tüm telemetri öğeleri (izlemeler ve özel durumlar gibi) değerini isteğin operation_parentId değerine ayarladır. id

Başka bir bileşene yapılan HTTP çağrısı gibi her giden işlem, bağımlılık telemetrisi ile temsil eder. Bağımlılık telemetrisi, genel olarak id benzersiz olan kendi telemetrisini de tanımlar. Bu bağımlılık çağrısı tarafından başlatılan istek telemetrisi bunu olarak id operation_parentId kullanır.

, ve kullanarak dağıtılmış mantıksal işlem görünümünü ile operation_Id operation_parentId derlemek request.id için dependency.id . Bu alanlar ayrıca telemetri çağrılarının nedensellik sıralarını da tanımlar.

Mikro hizmet ortamında bileşenlerden gelen izlemeler farklı depolama öğelerine gidebilir. Her bileşenin Application Analizler'da kendi araç Analizler. Mantıksal işlem için telemetri almak için Uygulama Analizler her depolama öğesinden veri sorgular. Depolama öğelerinin sayısı büyük olduğunda, bir sonrakine bakmanız gereken yer hakkında bir ipucuna ihtiyacınız vardır. Application Analizler veri modeli, bu sorunu çözmek için iki alan tanımlar: request.source ve dependency.target . İlk alan, bağımlılık isteğini başlatan bileşeni tanımlar. İkinci alan, bağımlılık çağrısının yanıtını hangi bileşenin döndürülen olduğunu tanımlar.

Örnek

Bir örneğe göz atalım. Stock Prices adlı bir uygulama, Stock adlı dış API'yi kullanarak bir hisse senedinin geçerli pazar fiyatını gösterir. Stock Prices uygulamasında, istemci web tarayıcısının kullanarak açtığı Stock sayfası adlı bir sayfa GET /Home/Stock vardır. Uygulama, HTTP çağrısını kullanarak Stock API'sini GET /api/stock/value sorgular.

Bir sorgu çalıştırarak elde edilen telemetri verilerini analiz edersiniz:

(requests | union dependencies | union pageViews)
| where operation_Id == "STYz"
| project timestamp, itemType, name, id, operation_ParentId, operation_Id

Sonuçlarda, tüm telemetri öğelerinin kökünü paylaştığını operation_Id unutmayın. Sayfadan bir Ajax çağrısı yapılırken, bağımlılık telemetri verilerine yeni bir benzersiz kimlik ( ) atanır ve pageView kimliği qJSXU olarak operation_ParentId kullanılır. Ardından sunucu isteği ajax kimliğini olarak operation_ParentId kullanır.

ıtemtype name ID operation_ParentId operation_Id
pageView Hisse senedi sayfası STYz STYz
Bağımlılık GET /Home/Stock qJSXU STYz STYz
istek GET Giriş/Stok KqKwlrSt9PA= qJSXU STYz
Bağımlılık GET /api/stock/value bBrf2L7mm2g= KqKwlrSt9PA= STYz

Bir dış hizmete çağrı yapılırken, alanı uygun şekilde ayarlamak için bu sunucunun GET /api/stock/value kimliğini dependency.target biliyor gerekir. Dış hizmet izlemeyi desteklemezse, target hizmetin ana bilgisayar adına ayarlanır (örneğin, stock-prices-api.com ). Ancak hizmet, önceden tanımlanmış bir HTTP üst bilgisi döndürerek kendini tanımlarsa, Application Analizler'nin o hizmetten telemetri sorgular tarafından dağıtılmış izleme oluşturması için izin veren target hizmet kimliğini içerir.

W3C TraceContext kullanarak bağıntı üst bilgileri

Uygulama Analizler W3C İzleme Bağlamına geçişte:

  • traceparent: Genel olarak benzersiz işlem kimliğini ve çağrının benzersiz tanımlayıcısını taşır.
  • tracestate: Sisteme özgü izleme bağlamını taşır.

Application Analizler SDK'sı en son sürümü Trace-Context protokolünü destekler, ancak bunu kabul etmek gerekebilir. (Application Analizler SDK tarafından desteklenen önceki bağıntı protokolüyle geriye dönük uyumluluk korunacak.)

Request-Id olarak da adlandırılan bağıntı HTTPprotokolü kullanım dışıdır. Bu protokol iki üst bilgi tanımlar:

  • Request-Id: Çağrının genel olarak benzersiz kimliğini taşır.
  • Correlation-Context: Dağıtılmış izleme özelliklerinin ad-değer çiftleri koleksiyonunu taşır.

Uygulama Analizler, bağıntı HTTP protokolü uzantısını da tanımlar. Hemen Request-Context çağıran veya çağıran tarafından kullanılan özellik koleksiyonunu yayma için ad-değer çiftlerini kullanır. Application Analizler SDK' sı, ve alanlarını ayarlamak için dependency.target bu üst bilgiyi request.source kullanır.

W3C İzleme Bağlamı ve Uygulama Analizler modelleri aşağıdaki şekilde eşler:

Application Insights W3C TraceContext
Idve Request``Dependency parent-id
Operation_Id trace-id
Operation_ParentId Bu aralığın üst aralığın parent-id. Bu bir kök yayılma alanı ise bu alanın boş olması gerekir.

Daha fazla bilgi için bkz. Uygulama Analizler telemetri veri modeli.

.NET uygulamaları için W3C dağıtılmış izleme desteğini etkinleştirme

W3C TraceContext tabanlı dağıtılmış izleme, tüm son .NET Framework/.NET Core SDK'larında varsayılan olarak etkindir ve eski Request-Id uyumluluk sağlar.

Java uygulamaları için W3C dağıtılmış izleme desteğini etkinleştirme

Java 3.0 aracısı

Java 3.0 aracısı W3C'nin ilk kez desteklemektedir ve ek yapılandırma gerekmez.

Java SDK

  • Gelen yapılandırma

    • Java EE uygulamaları için aşağıdakini <TelemetryModules> uygulamanın etiketine ApplicationInsights.xml:

      <Add type="com.microsoft.applicationinsights.web.extensibility.modules.WebRequestTrackingTelemetryModule>
         <Param name = "W3CEnabled" value ="true"/>
         <Param name ="enableW3CBackCompat" value = "true" />
      </Add>
      
    • Daha Spring Boot için şu özellikleri ekleyin:

      • azure.application-insights.web.enable-W3C=true
      • azure.application-insights.web.enable-W3C-backcompat-mode=true
  • Giden yapılandırma

    Aşağıdaki bilgileri AI-Agent.xml:

    <Instrumentation>
      <BuiltIn enabled="true">
        <HTTP enabled="true" W3C="true" enableW3CBackCompat="true"/>
      </BuiltIn>
    </Instrumentation>
    

    Not

    Geriye dönük uyumluluk modu varsayılan olarak etkindir ve parametresi enableW3CBackCompat isteğe bağlıdır. Bunu yalnızca geriye dönük uyumluluğu kapatmak istediğinizde kullanın.

    İdeal olarak, tüm hizmetleriniz W3C protokolünü destekleyen SDK 'ların daha yeni sürümlerine güncelleştirildiği zaman bunu devre dışı bırakabilirsiniz. Bu yeni SDK 'lara mümkün olan en kısa sürede geçiş yapmanızı önemle tavsiye ederiz.

Önemli

Gelen ve giden yapılandırmaların tam olarak aynı olduğundan emin olun.

Web Apps için W3C dağıtılmış izleme desteğini etkinleştir

Bu özellik ' de bulunur Microsoft.ApplicationInsights.JavaScript . Varsayılan olarak devre dışıdır. Etkinleştirmek için, config kullanın distributedTracingMode . AI_AND_W3C, Application Insights tarafından işaretlenmiş eski hizmetlerle geriye dönük uyumluluk için sağlanır.

Aşağıdaki yapılandırmayı ekleyin:

  distributedTracingMode: DistributedTracingModes.W3C

Aşağıdaki yapılandırmayı ekleyin:

    distributedTracingMode: 2 // DistributedTracingModes.W3C

Önemli

Bağıntıyı etkinleştirmek için gereken tüm konfigürasyonları görmek için JavaScript bağıntı belgelerinebakın.

OpenCensus Python 'da telemetri bağıntısı

OpenCensus Python, ek yapılandırma gerektirmeden W3C Trace-Context ' i destekler.

Başvuru olarak, OpenCensus veri modeli buradabulunabilir.

Gelen istek bağıntısı

OpenCensus Python 'da W3C Trace-Context gelen isteklerden gelen üst bilgileri, isteklerden oluşturulan yayılmaya ilişkilendirir. OpenCensus, bu popüler web uygulaması çerçeveleri için tümleştirmelerle otomatik olarak yapılır: Flask, Docgo ve piramit. Yalnızca W3C Trace-Context üst bilgilerini doğru biçimde doldurmanız ve istekle birlikte göndermeniz gerekir. Bunu gösteren örnek bir Flask uygulaması aşağıda verilmiştir:

from flask import Flask
from opencensus.ext.azure.trace_exporter import AzureExporter
from opencensus.ext.flask.flask_middleware import FlaskMiddleware
from opencensus.trace.samplers import ProbabilitySampler

app = Flask(__name__)
middleware = FlaskMiddleware(
    app,
    exporter=AzureExporter(),
    sampler=ProbabilitySampler(rate=1.0),
)

@app.route('/')
def hello():
    return 'Hello World!'

if __name__ == '__main__':
    app.run(host='localhost', port=8080, threaded=True)

Bu kod, yerel makinenizde bir örnek Flask uygulaması çalıştırır ve bağlantı noktasını dinler 8080 . İzleme bağlamını ilişkilendirmek için uç noktaya bir istek gönderirsiniz. Bu örnekte, bir curl komut kullanabilirsiniz:

curl --header "traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01" localhost:8080

Trace-Context üst bilgi biçiminebakarak aşağıdaki bilgileri türetebilirsiniz:

version: 00

trace-id: 4bf92f3577b34da6a3ce929d0e0e4736

parent-id/span-id: 00f067aa0ba902b7

trace-flags: 01

Azure Izleyici 'ye gönderilen istek girişine bakarsanız, izleme üst bilgisi bilgileriyle doldurulmuş alanları görebilirsiniz. bu verileri Azure izleyici Application Insights kaynağında günlükler (analiz) altında bulabilirsiniz.

Günlüklerde telemetri isteme (Analiz)

idAlanı, <trace-id>.<span-id> trace-id istek içinde geçirilen izleme başlığından alındığı ve span-id Bu yayılma için oluşturulan 8 baytlık bir dizi olan biçimindedir.

operation_ParentIdAlanı, <trace-id>.<parent-id> hem hem de ' ın trace-id parent-id istekte geçirilen izleme başlığından alındığı biçimdedir.

Günlük bağıntısı

OpenCensus Python, kayıtları günlüğe kaydetmek için bir izleme KIMLIĞI, bir span ID ve örnekleme bayrağı ekleyerek günlüklerinizi ilişkilendirmenize olanak sağlar. Bu öznitelikleri, OpenCensus günlük tümleştirmesi' ni yükleyerek eklersiniz. Aşağıdaki öznitelikler Python LogRecord nesnelerine eklenecektir: traceId , spanId , ve traceSampled . Bu, yalnızca tümleştirmeden sonra oluşturulan Günlükçüler için geçerli olduğunu unutmayın.

Bunu gösteren örnek bir uygulama aşağıda verilmiştir:

import logging

from opencensus.trace import config_integration
from opencensus.trace.samplers import AlwaysOnSampler
from opencensus.trace.tracer import Tracer

config_integration.trace_integrations(['logging'])
logging.basicConfig(format='%(asctime)s traceId=%(traceId)s spanId=%(spanId)s %(message)s')
tracer = Tracer(sampler=AlwaysOnSampler())

logger = logging.getLogger(__name__)
logger.warning('Before the span')
with tracer.span(name='hello'):
    logger.warning('In the span')
logger.warning('After the span')

Bu kod çalıştırıldığında, konsolunda aşağıdaki şekilde yazdırılır:

2019-10-17 11:25:59,382 traceId=c54cb1d4bbbec5864bf0917c64aeacdc spanId=0000000000000000 Before the span
2019-10-17 11:25:59,384 traceId=c54cb1d4bbbec5864bf0917c64aeacdc spanId=70da28f5a4831014 In the span
2019-10-17 11:25:59,385 traceId=c54cb1d4bbbec5864bf0917c64aeacdc spanId=0000000000000000 After the span

spanIdYayılma alanındaki günlük iletisi için bir mevcut olduğuna dikkat edin. Bu, spanId adlı yayılmasına ait olan aynıdır hello .

Kullanarak günlük verilerini dışa aktarabilirsiniz AzureLogHandler . Daha fazla bilgi için bu makaleye bakın.

Ayrıca, uygun bağıntı için izleme bilgilerini bir bileşenden diğerine geçirebiliriz. Örneğin, iki bileşeni ve ' nin bulunduğu bir senaryoyu düşünün module1 module2 . Module1, Module2 içindeki işlevleri çağırır ve module1 module2 tek bir izlemede bulunan ve tek bir izlemede günlükleri almak için aşağıdaki yaklaşımı kullanabiliriz:

# module1.py
import logging

from opencensus.trace import config_integration
from opencensus.trace.samplers import AlwaysOnSampler
from opencensus.trace.tracer import Tracer
from module2 import function_1

config_integration.trace_integrations(['logging'])
logging.basicConfig(format='%(asctime)s traceId=%(traceId)s spanId=%(spanId)s %(message)s')
tracer = Tracer(sampler=AlwaysOnSampler())

logger = logging.getLogger(__name__)
logger.warning('Before the span')
with tracer.span(name='hello'):
   logger.warning('In the span')
   function_1(tracer)
logger.warning('After the span')

# module2.py

import logging

from opencensus.trace import config_integration
from opencensus.trace.samplers import AlwaysOnSampler
from opencensus.trace.tracer import Tracer

config_integration.trace_integrations(['logging'])
logging.basicConfig(format='%(asctime)s traceId=%(traceId)s spanId=%(spanId)s %(message)s')
tracer = Tracer(sampler=AlwaysOnSampler())

def function_1(parent_tracer=None):
    if parent_tracer is not None:
        tracer = Tracer(
                    span_context=parent_tracer.span_context,
                    sampler=AlwaysOnSampler(),
                )
    else:
        tracer = Tracer(sampler=AlwaysOnSampler())

    with tracer.span("function_1"):
        logger.info("In function_1")

.NET 'te telemetri bağıntısı

.NET çalışma zamanı, etkinlik ve diagnosticsource 'un yardımıyla dağıtılmasını destekler

Application Insights .net SDK, DiagnosticSource Activity telemetri toplamak ve ilişkilendirmek için ve kullanır.

Java 'da telemetri bağıntısı

Java Aracısı Telemetriyi otomatik olarak bağıntısını destekler. operation_idBir isteğin kapsamında verilen tüm telemetri (izlemeler, özel durumlar ve özel olaylar gibi) otomatik olarak doldurulur. Java SDK Aracısı yapılandırılmışsa, hizmet-hizmet çağrıları için de bağıntı üst bilgilerini (daha önce AÇıKLANAN) http aracılığıyla yayar.

Not

Application Insights Java aracısı, jms, Kafka, netty/webflox ve daha fazlası için istekleri ve bağımlılıkları otomatik olarak toplar. Java SDK için yalnızca Apache HttpClient aracılığıyla yapılan çağrılar bağıntı özelliği için desteklenir. (Kafka, kbbitmq ve Azure Service Bus gibi) mesajlaşma teknolojileri genelinde otomatik bağlam yayma SDK 'da desteklenmez.

Not

Özel telemetri toplamak için, uygulamayı Java 2,6 SDK 'Sı ile birlikte belirlemeniz gerekir.

Rol adları

Uygulama eşlemesindebileşen adlarının görüntülenme şeklini özelleştirmek isteyebilirsiniz. Bunu yapmak için, cloud_RoleName aşağıdaki eylemlerden birini gerçekleştirerek el ile ayarlayabilirsiniz:

  • Application Insights Java aracısı 3,0 için, bulut rolü adını şu şekilde ayarlayın:

    {
      "role": {
        "name": "my cloud role name"
      }
    }
    

    Ayrıca, ortam değişkenini kullanarak bulut rolü adını da ayarlayabilirsiniz APPLICATIONINSIGHTS_ROLE_NAME .

  • Application Insights Java SDK 2.5.0 ve üzeri ile cloud_RoleName <RoleName> ApplicationInsights.xml dosyanıza ekleyerek belirtebilirsiniz:

    <?xml version="1.0" encoding="utf-8"?>
    <ApplicationInsights xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings" schemaVersion="2014-05-30">
       <InstrumentationKey>** Your instrumentation key **</InstrumentationKey>
       <RoleName>** Your role name **</RoleName>
       ...
    </ApplicationInsights>
    
  • spring boot uygulamasını Application Insights spring boot Starter ile birlikte kullanıyorsanız, uygulama için özel adınızı uygulama. özellikler dosyasında ayarlamanız yeterlidir:

    spring.application.name=<name-of-app>

    Spring Boot Starter, cloudRoleName özelliği için girdiğiniz değere otomatik olarak atar spring.application.name .

Sonraki adımlar