【问题标题】:How to create a log-based alert using the Monitoring API?如何使用 Monitoring API 创建基于日志的警报?
【发布时间】:2021-09-01 00:14:38
【问题描述】:

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

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

【问题讨论】:

    标签: google-cloud-platform google-cloud-monitoring


    【解决方案1】:
    • 三个条件类型 MetricAbsence、MetricThreshold 和 MonitoringQueryLanguageCondition 是Conditions for metric-based alerting policies。由于我们要创建基于日志的警报策略,根据Condition for log-based alerting policies,条件类型必须为“LogMatch”。

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

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

    • 所以,建议使用UI或以上的API,而不是客户端库,直到它支持条件。

    【讨论】:

    • 我也看到了,感谢您的确认。我确实编写了一个版本,让我通过进入并直接使用 protobuf 使用 API 进行基于日志的警报。我希望 Google 将来能够添加此功能。
    【解决方案2】:

    正如 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;
      }
    

    把它放在一起

    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();
    

    【讨论】:

      猜你喜欢
      • 2021-10-26
      • 1970-01-01
      • 2021-11-28
      • 2022-11-09
      • 2018-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-14
      相关资源
      最近更新 更多