public static TraceRequest()

in src/common/Telemetry.ts [136:222]


  public static TraceRequest(context: any) {
    let serviceType = "";
    let totalReqs = 0;
    let reqName = "";
    try{
      if (AzuriteTelemetryClient.enableTelemetry && AzuriteTelemetryClient.requestClient !== undefined)
      {
        if (context instanceof BlobContext)
        {
          serviceType = "Blob";
          AzuriteTelemetryClient._totalBlobRequestCount++;
          totalReqs = AzuriteTelemetryClient._totalBlobRequestCount;
          reqName = "B_" + BlobOperation[context.operation??0];
        }
        else if (context instanceof QueueContext)
        {
          serviceType = "Queue";
          AzuriteTelemetryClient._totalQueueRequestCount++;          
          totalReqs = AzuriteTelemetryClient._totalQueueRequestCount;
          reqName = "Q_" + QueueOperation[context.operation??0];
        }
        else if (context instanceof TableContext)
        {
          serviceType = "Table";
          AzuriteTelemetryClient._totalTableRequestCount++;
          totalReqs = AzuriteTelemetryClient._totalTableRequestCount;
          reqName = "T_" + TableOperation[context.operation??0];
        }
        let requestProperties: { [key: string]: any } = {
          apiVersion: "v"+context.request?.getHeader("x-ms-version"),
          authorization: context.request !== undefined ? AzuriteTelemetryClient.GetRequestAuthentication(context.request.getHeader("authorization"), context.request.getQuery("sig")) : "",
          instanceID: AzuriteTelemetryClient.instanceID,
          sessionID: AzuriteTelemetryClient.sessionID,
          ReqNo:totalReqs,
        };

        const ingress = context.request?.getHeader("content-length");
        if (ingress !== undefined)
          {
            if (ingress && parseInt(ingress)) {
              requestProperties["ingress"] = ingress;
              this._totalIngressSize += parseInt(ingress);
            }
          }

          // When body is xml or json, "content-length" header won't return even has body, so currently can't be caculated into egress in telemetry.
          // Head request don't has body but can has "content-length" header, like in GetBlobProperties "content-length" header means the blob length but not body length
          if (context.request?.getMethod() !== "HEAD")
          {
            const egress = context.response?.getHeader("content-length");
            if (egress !== undefined)
            {
              if (egress && parseInt(egress)) {
                requestProperties["egress"] = egress;
                this._totalEgressSize += parseInt(egress);
              }
            }
          }

        AzuriteTelemetryClient.requestClient.trackRequest(
        {
          name:reqName, 
          url:context.request !== undefined ? AzuriteTelemetryClient.GetRequestUri(context.request.getEndpoint()) : "",  
          duration:context.startTime?((new Date()).getTime() - context.startTime?.getTime()):0, 
          resultCode:context.response?.getStatusCode()??0, 
          success:(context.response?.getStatusCode() ?? 500) <= 399,
          id: context.contextId, // Request ID
          source: context.request?.getHeader("user-agent"), // User Agent
          properties: requestProperties,
          contextObjects:
          {
            operationId: "",
            operationParentId: "",
            operationName: "test",
            operation_Name: "test",
            appName: ""
          }
        });

        logger.verbose(`Send ${serviceType} telemetry: ` + reqName, context.contextId === undefined ? context.contextID : context.contextId);
      }
    }
    catch (e)
    {
      logger.warn(`Fail to telemetry a ${serviceType} request, error: ` + e.message);
    }
  }