gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 02:06:29 26 4
gpt4 key购买 nike

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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com