Azure 静态 Web 应用程序可以为新的 PullRequests done via GitHub 自动创建“临时环境” .
这工作得很好,但是有一个问题,当 monitoring gets enabled通过 Azure Application Insights,“生产性”SWA 应用程序和所有当前部署的暂存环境的所有跟踪
和异常
都附加在相同的日志表中(例如,在痕迹
)。
是否可以以某种方式选择环境作为列或创建一个 KQL 查询来过滤例如仅用于“生产”?
我知道我还可以为每个创建的临时环境配置单独的 Application Insights 实例 - 但随后我必须为每个新创建的环境(默认情况下)以不同的方式调整 APPINSIGHTS_INSTRUMENTATIONKEY
应用程序设置只需在创建新 PR 时从“生产”复制设置)。
最佳答案
我最终通过以下方式解决了这个问题:
- 在应注入(inject)“环境”的源文件中定义一个占位符:
const envName = "__ENVIRONMENT_NAME__";
- 使用 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/