【问题标题】:Distinguish different environments of logs in Azure Static Web Apps (SWA) in Application Insights在 Application Insights 中区分 Azure Static Web Apps (SWA) 中日志的不同环境
【发布时间】:2022-12-12 20:54:41
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您是否检查过轨迹表中的条目以查看是否可以找到任何不同的属性?您通常还可以在 App Insights 日志记录中包含客户属性 - 因此,如果静态 Web 应用程序知道它在哪个环境下运行,它可以将其作为自定义属性添加到日志记录中
  • 是的,我检查了其他条目,但没有找到与运行该函数的主机不同的属性。我目前尝试将自定义属性添加到日志中 - 但对于 Azure SWA context.log 这是不可能的,我必须添加“applicationinsights”作为依赖项 - 这使事情变得非常复杂。

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


【解决方案1】:

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

  1. 在应该注入“环境”的源文件中定义一个占位符: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" {} +
    
    1. 创建自定义记录器,包装 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 {
            this.azLogger.error(`[${envName}] ` + args[0], args.shift());
        }
    
        public warn(...args: any[]): void {
            this.azLogger.warn(`[${envName}] ` + args[0], args.shift());
        }
    
        public info(...args: any[]): void {
            this.azLogger.info(`[${envName}] ` + args[0], args.shift());
        }
    
        public verbose(...args: any[]): void {
            this.azLogger.verbose(`[${envName}] ` + args[0], args.shift());
        }
    }
    
    1. 在 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.');
      ...
    }
    
    1. 增强 Azure Application Insights KQL 查询以将“环境”提取为单独的列:
    traces
    | order by timestamp desc 
    | extend env_and_message=extract_all(@"^[([a-zA-Z0-9-_]+)] (.*)", message)
    | extend TheMsg=iif(env_and_message[0][1] != '', env_and_message[0][1], message)
    | project timestamp, ENV=env_and_message[0][0], MSG=TheMsg, OID=operation_Id
    

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    • 2020-02-25
    • 1970-01-01
    • 2022-01-12
    • 2022-01-11
    相关资源
    最近更新 更多