azure - 在 Application Insights 中区分 Azure 静态 Web 应用 (SWA) 中日志的不同环境

标签 azure azure-application-insights kql azure-static-web-app

Azure 静态 Web 应用程序可以为新的 PullRequests done via GitHub 自动创建“临时环境” .

这工作得很好,但是有一个问题,当 monitoring gets enabled通过 Azure Application Insights,“生产性”SWA 应用程序和所有当前部署的暂存环境的所有跟踪异常都附加在相同的日志表中(例如,在痕迹)。

是否可以以某种方式选择环境作为列或创建一个 KQL 查询来过滤例如仅用于“生产”?

我知道我还可以为每个创建的临时环境配置单独的 Application Insights 实例 - 但随后我必须为每个新创建的环境(默认情况下)以不同的方式调整 APPINSIGHTS_INSTRUMENTATIONKEY 应用程序设置只需在创建新 PR 时从“生产”复制设置)。

最佳答案

我最终通过以下方式解决了这个问题:

  1. 在应注入(inject)“环境”的源文件中定义一个占位符:const envName = "__ENVIRONMENT_NAME__";
  2. 使用 Azure/static-web-apps-deploy 增强了 GitHub 操作在构建+部署之前通过一些步骤确定分支名称,并通过 find + -exec sed 替换所有 TypeScript *.ts 文件中的占位符与分支名称:
      - name: Get branch name (merge)
        if: github.event_name != 'pull_request'
        shell: bash
        run: echo "BRANCH_NAME=$(echo ${GITHUB_REF#refs/heads/} | tr / -)" >> $GITHUB_ENV
      - name: Get branch name (pull request)
        if: github.event_name == 'pull_request'
        shell: bash
        run: echo "BRANCH_NAME=$(echo ${GITHUB_HEAD_REF} | tr / -)" >> $GITHUB_ENV
      - name: Inject environment name in api function files
        run: |
          find ./api -name "*.ts" -not -path "./api/node_modules/*" -exec sed -i "s@__ENVIRONMENT_NAME__@${{ env.BRANCH_NAME }}@g" {} +
  • 创建自定义记录器,包装 Azure 函数Context.Logger:
  • import { Logger } from "@azure/functions"
    
    const envName = "__ENVIRONMENT_NAME__"; // injected via GH actions build
    
    export class MyLogger {
        private azLogger: Logger;
    
        constructor(realLogger: Logger) {
            this.azLogger = realLogger;
        }
    
        public error(...args: any[]): void {
            const first = args.shift();
            if (args.length > 0) {
                this.azLogger.error(`[${envName}] ` + first, args);
            } else {
                this.azLogger.error(`[${envName}] ` + first);
            }
        }
    
        public warn(...args: any[]): void {
            const first = args.shift();
            if (args.length > 0) {
                this.azLogger.warn(`[${envName}] ` + first, args);
            } else {
                this.azLogger.warn(`[${envName}] ` + first);
            }
        }
    
        public info(...args: any[]): void {
            const first = args.shift();
            if (args.length > 0) {
                this.azLogger.info(`[${envName}] ` + first, args);
            } else {
                this.azLogger.info(`[${envName}] ` + first);
            }
        }
    
        public verbose(...args: any[]): void {
            const first = args.shift();
            if (args.length > 0) {
                this.azLogger.verbose(`[${envName}] ` + first, args);
            } else {
                this.azLogger.verbose(`[${envName}] ` + first);
            }
        }
    }
    
  • 在 AzureFunction http 函数中实例化 MyLogger,然后始终使用自定义记录器进行日志记录:
  • const httpTrigger: AzureFunction = async function (context: Context, req: HttpRequest): Promise<void> {
      const logger = new MyLogger(context.log);
      logger.info('HTTP trigger function processed a request.');
      ...
    }
    
  • 增强 Azure Application Insights KQL 查询,将“环境”提取为单独的列:
  • traces
    | order by timestamp desc 
    | parse message with '[' environment ']' msg
    | extend TheMsg=iif(msg != '', msg, message)
    | project timestamp, ENV=environment, OP=operation_Name, MSG=TheMsg
    

    因此,无需使用“applicationinsights” npm 依赖项并进行复杂的配置,环境名称可作为日志中的单独列使用。

    关于azure - 在 Application Insights 中区分 Azure 静态 Web 应用 (SWA) 中日志的不同环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74732586/

    相关文章:

    c# - Azure 计算模拟器无法启动。代理因错误而崩溃(连续)

    azure - 创建逻辑应用程序后,是否有任何方法可以在逻辑应用程序上启用日志分析?

    javascript - 如何通过 App Insights 获取与网页交互的时间

    Azure Application Insights - 辅助角色中的进程 CPU

    正在重新创建 Azure 容器实例

    javascript - 在 Node.js Web 应用程序中使用用户名和密码在 Azure AD 上进行身份验证

    azure-application-insights - 为什么在应用程序洞察中请求具有重复的操作_id 的表?

    Azure Kusto 时间序列

    Excel 自行删除我的查询连接并给出几条错误消息

    azure-data-explorer - Kusto - 每个系列的最后一行时间戳