SDK per la tracciabilità completa del framework basato sulla configurazione (.NET )

L'SDK Full Framework Trace di .NET, basato sulla configurazione, consente di specificare in modo dichiarativo gli span e i tag che devono contenere, nonché di crearli eseguendo determinati metodi dell'applicazione.

L'approccio dichiarativo è leggermente più espressivo rispetto all'uso dell'SDK di tracciamento basato sul codice, sebbene non offra tutte le funzionalità.

Prima di implementare il tracciamento personalizzato, leggi le best practice relative al tracciamento.

Dichiarazione di non responsabilità

L'SDK basato sulla configurazione è fragile rispetto alle modifiche nella tua applicazione. È possibile ridenominare una classe o un metodo e improvvisamente la configurazione non corrisponde più e si perdono i dati di traccia. Quando possibile, consigliamo di utilizzare l 'SDK completo del framework .NET, che è molto più resistente alle modifiche del codice e offre più funzionalità per aiutarti a raggiungere i tuoi obiettivi.

Configurazione

La configurazione è specificata nel configuration.yaml file.

Nota: le modifiche apportate alla configurazione dell'SDK Full Framework Trace di .NET basato sulla configurazione vengono rilevate automaticamente dall'agente Instana. Le applicazioni già strumentate devono essere riavviate per utilizzare la configurazione modificata.
Nota: la configurazione basata sull'SDK Full Framework Trace di .NET è disponibile nel sensore 1.1.44 CLR o nelle versioni successive. Nelle versioni precedenti a 1.1.47 si tratta di una funzione che deve essere attivata manualmente. Per attivarla, imposta la variabile d'ambiente INSTANA_CLR_SDKCONFIG su 1 . Le versioni >= 1.1.47 non necessitano più di questo parametro.

Formato

Il seguente elenco descrive il formato generale della configurazione:

# .NET Full Framework Tracing
com.instana.plugin.clr:
  instrumentation:
    sdk:
      targets:
        - match:
            type: class
            class: '<type-name>'
            method: '<method-name>'
            arguments: <number of arguments>
          span:
            name: '<span-name>'
            type: 'ENTRY' | 'EXIT' | 'INTERMEDIATE'
            tags:
              - name: '<name of tag>'
                kind: argument
                index: <0-based index of the method's argument>
              - name: '<name of tag>'
                kind: constant
                value: '<constant value>'
              - name: '<name of tag>'
                kind: return
 

È possibile definire più destinazioni all'interno della chiave targets , ognuna delle quali specifica un'estensione da creare. L'oggetto match di uno target specifica il metodo a cui applicare la strumentazione. L'oggetto span specifica come creare lo span, compreso il suo nome (utilizzato, ad esempio, in Unbounded Analytics per il call.name filtro) e quali tag devono essere impostati.

Metodi di abbinamento allo strumento

Nota: l'SDK basato sulla configurazione attualmente supporta solo la corrispondenza dei metodi all'interno delle classi. La strumentazione basata sulle interfacce o sulle classi di base (che attraversano il percorso di eredità) non è ancora supportata.

Questo oggetto descrive il punto di codice in cui deve essere eseguita una strumentazione:

  • type: tipo di codice da strumentare; valori supportati:
    • class, corrispondenza di una classe concreta
  • name: Nome completo della classe, dell'interfaccia o della classe base da cercare. Per le classi annidate, è a.b.c.OutsideClass$NestedClass richiesta la notazione
  • method: nome del metodo della classe, interfaccia o classe di base fornita di cui deve essere registrato un richiamo
  • arguments: numero di argomenti utilizzati dal metodo (verranno associati solo i sovraccarichi con questo numero di argomenti). 0 se non viene passato alcun argomento.

Specificare l'aspetto delle campate

Questo oggetto descrive le proprietà dell'estensione che verrà creato se viene richiamato il metodo descritto in match :

  • name: nome esteso
  • type: tipo di span (facoltativo); valori supportati:
    • ENTRY, utilizzato per indicare chiamate "in entrata" da sistemi esterni
    • INTERMEDIATE, utilizzato per catturare chiamate interne a metodi "interessanti" (valore predefinito)
    • EXIT, utilizzato per indicare chiamate "in uscita" a sistemi esterni
  • tags: elenco di tag / annotazioni da catturare e come ottenerne i valori (facoltativo); valori supportati:
    • constant, cattura un valore costante
      • kind: constant
      • name: nome della tag da creare
      • value: valore costante del tag da creare
    • return, cattura il valore di ritorno del richiamo del metodo
      • kind: return
      • name: nome della tag da creare; il valore sarà il valore dell'oggetto restituito
    • argument, cattura un valore di argomento specifico del richiamo del metodo
      • kind: argument
      • name: nome della tag da creare
      • index: indice basato su 0 dell'argomento da catturare come valore della tag
Nota: se il valore acquisito è null o Nullable<T> privo di valore, il tag definito non verrà aggiunto. È possibile cercare gli intervalli con tag mancanti in Unbounded Analytics utilizzando is not present l'operatore insieme al call.tag filtro.

Intervalli errati

Se un Exception viene propagato al di fuori di un metodo strumentato, lo span verrà automaticamente contrassegnato come errato e il valore di Exception::Message verrà impostato come messaggio di errore, che potrai cercare in Unbounded Analytics tramite il call.error.message tag.

Esempio

Il seguente frammento mostra una configurazione di esempio della modalità di traccia di un'applicazione che gestisce i lavori batch:

com.instana.plugin.clr:
  instrumentation:
    sdk:
      targets:
        - match:
            type: class
            class: Example.BatchJobStarter
            method: ExecuteJob
            arguments: 1
          span:
            name: BatchJob
            type: ENTRY
            tags:
              - name: endpoint
                kind: constant
                value: BatchJob
              - name: batch.job
                kind: argument
                index: 0
        - match:
            type: class
            class: Example.ProprietaryDatabaseClient
            method: ExecuteQuery
            arguments: 1
          span:
            name: DatabaseCall
            type: EXIT
            tags:
              - name: db.connection_string
                kind: constant
                value: 'Data Source=SomeServer;Initial Catalog=SomeDB'
              - name: db.statement
                kind: argument
                index: 0
 

Per prima cosa, il metodo ExecuteJob nella classe Example.BatchJobStarter viene strumentato per creare le voci con nome BatchJob, l'annotazione endpoint con il valore costante BatchJobe l'annotazione batch.job con il primo argomento come valore.

Inoltre, le chiamate DB in uscita durante l'elaborazione batch, ovvero i richiami del metodo ExecuteQuery in Example.ProprietaryDatabaseClient, creeranno le estrazioni di uscita con nome DatabaseCall e l'annotazione db.connection_string con il valore costante Data Source=SomeServer;Initial Catalog=SomeDB e l'annotazione db.statement con il primo argomento del richiamo del metodo.

L'elaborazione di un nuovo batch con ExecuteJob avvierà una nuova traccia e i successivi aggiornamenti DB con ExecuteQuery verranno elencati come elementi secondari al suo interno. Tutte le funzionalità di Instana, come Unbounded Analytics, possono essere utilizzate esattamente come le tracce create con Instana AutoTrace.

Limitazioni

Le seguenti restrizioni si applicano all'SDK Full Framework Trace di .NET basato sulla configurazione:

  • La strumentazione dei costruttori non è supportata.
  • L'implementazione di metodi statici non è supportata.
  • L'avvio di un'estensione in un metodo e la sua chiusura in un altro metodo non è supportato; ossia, l'SDK basato sulla configurazione non ha un equivalente per MethodPairInstrumentation utilizzato in autotrace
  • La cattura di tutti gli argomenti o del valore di ritorno senza la creazione esplicita di un tag non è supportata.
  • La specifica di modelli di nomi per classi o metodi non è supportata.
  • Il ripristino di un contesto di traccia prima della creazione di un'estensione non è supportato