如何使用监控 API 创建基于日志的警报?

How to create a log-based alert using the Monitoring API?

documentation 上它说有一个 link 用于使用监控创建基于日志的警报的示例 API 但只有一个示例如何使用UI.

我在使用 Java 监控 API 构建新的 alertPolicy 时遇到问题,因为似乎没有用于基于日志的警报的条件生成器(使用日志查询过滤器)。我认为我不应该使用 Absent、Threshold 或 MonitoringQueryLanguage 选项。我怎样才能建立正确的条件?

  • 三个条件类型MetricAbsence、MetricThreshold和MonitoringQueryLanguageCondition是Conditions for metric-based alerting policies. Since we want to create a log based alert policy, according to the Condition for log-based alerting policies,条件类型必须是“LogMatch”。

  • AlertPolicy.Condition.Builder class 具有使用基于指标的警报条件类型设置条件的方法,但不能使用基于日志的条件类型(即 LogMatch)设置条件。 class "AlertPolicy.Condition.Builder" 似乎没有办法这样做。请注意,根据 public 文档 ,基于日志的警报是 GA 前(预览)功能。所以各种客户端库可能还不支持这个。

  • 虽然,在使用 projects.alertPolicies.create 创建新的警报策略时,我们可以添加“conditionMatchedLog”类型的条件。

  • 因此,建议使用UI或以上API,但在支持条件之前不要使用客户端库。

正如 Ashish 所指出的,这在客户端库中目前不可用。希望它会很快被添加,但对于任何想要使用 Java 客户端库添加基于日志的警报条件 (conditionMatchedLog) 的人来说,这就是代码的样子。

  public static UnknownFieldSet createConditionMatchedLog(String filter) {
    // filter = "\nseverity = \"NOTICE\""; example filter

    UnknownFieldSet.Field logMatchString =
            UnknownFieldSet.Field.newBuilder()
                    .addLengthDelimited(ByteString.copyFromUtf8(filter))
                    .build();

    UnknownFieldSet logMatchFilter =
            UnknownFieldSet.newBuilder()
                    .addField(1, logMatchString)
                    .build();

    UnknownFieldSet.Field logMatchFilterCombine =
            UnknownFieldSet.Field.newBuilder()
                    .addLengthDelimited(logMatchFilter.toByteString())
                    .build();

    UnknownFieldSet logMatchCondition =
            UnknownFieldSet.newBuilder()
                    .addField(20, logMatchFilterCombine)
                    .build();

    return logMatchCondition;
  }

在构建实际的Alert时,还需要定义Alert Strategy。

public static UnknownFieldSet createAlertStrategyFieldSet(long periodTime) {
    //Making the alertStrategy field since you need those for log based alert policies
    UnknownFieldSet.Field period =
            UnknownFieldSet.Field.newBuilder()
                    .addVarint(periodTime) //must be an long
                    .build();

    UnknownFieldSet periodSet =
            UnknownFieldSet.newBuilder()
                    .addField(1, period)
                    .build();

    UnknownFieldSet.Field periodSetField =
            UnknownFieldSet.Field.newBuilder()
                    .addLengthDelimited(periodSet.toByteString())
                    .build();

    UnknownFieldSet periodSetFieldUp =
            UnknownFieldSet.newBuilder()
                    .addField(1, periodSetField)
                    .build();

    UnknownFieldSet.Field periodSetField2 =
            UnknownFieldSet.Field.newBuilder()
                    .addLengthDelimited(periodSetFieldUp.toByteString())
                    .build();

    UnknownFieldSet periodSetFieldUp2 =
            UnknownFieldSet.newBuilder()
                    .addField(1, periodSetField2)
                    .build();

    UnknownFieldSet.Field periodSetField3 =
            UnknownFieldSet.Field.newBuilder()
                    .addLengthDelimited(periodSetFieldUp2.toByteString())
                    .build();


    UnknownFieldSet AlertStrategy =
            UnknownFieldSet.newBuilder()
                    .addField(21, periodSetField3)
                    .build();
    return AlertStrategy;
  }

放在一起[=13​​=]

UnknownFieldSet conditionMatchedLog = createConditionMatchedLog(filter);

// Construct Condition object
AlertPolicy.Condition alertPolicyCondition =
        AlertPolicy.Condition.newBuilder()
                .setDisplayName(med.getConditions().get(index).getDisplayName())
                .setUnknownFields(conditionMatchedLog)
                .build();

//Making the alertStrategy field since you need those for log based alert policies
UnknownFieldSet alertStrategy = createAlertStrategyFieldSet(convertTimePeriodFromString(med.getAlertStrategy().getNotificationRateLimit().getPeriod()));

// Build the log based alert policy
AlertPolicy alertPolicy =
        AlertPolicy.newBuilder()
                .setDisplayName(med.getDisplayName())
                .addConditions(alertPolicyCondition)
                .setCombiner(AlertPolicy.ConditionCombinerType.OR)
                .setEnabled(BoolValue.newBuilder().setValue(true).build())
                .setUnknownFields(alertStrategy)
                .build();