【问题标题】:Advanced filter can't express ISNULL?高级过滤器不能表达ISNULL?
【发布时间】:2019-05-17 16:53:09
【问题描述】:

这两个过滤器返回零结果:

  • resource.labels:* AND resource.labels.namespace_name:*
  • resource.labels:* AND NOT resource.labels.namespace_name:*

虽然这个回报很多:

  • resource.labels:*

我对此有三个问题:

  1. 这是怎么回事?
  2. 更重要的是,如何排除特定值 namespace_name while not 不包括未定义的记录 命名空间名称?
  3. 同样,如何为所有定义命名空间名称的记录编写过滤器?

【问题讨论】:

  • resource.labels.namespace_name:* 是否返回任何内容?一个预感是你不能否定场的存在。这可能(!)是索引存在的属性的结果(因此,没有属性的记录,没有出现在索引中)。一种解决方案(不能通过控制台获得)是获取日志,然后排除那些与您希望排除的 namespace_name 值匹配的日志。是的:2 个步骤,你需要另一个工具(可能是 jq)。
  • 你说得对;我已经预先过滤了这组结果以排除那些定义命名空间名称的结果,以使我对问题的解释更简单。
  • 根据您的理论,Stackdriver 只是天生无法代表我的查询?在那种情况下,通过“接收器”将日志导出到另一个系统对我有帮助吗?我想保留 stackdriver 的能力来近乎实时地“tail”它的日志,所以也许我的一组约束是无法满足的......例如,我找不到任何方法来跟踪来自 gcloud 的 stackdriver 日志CLI。
  • 客户将日志接收到例如BigQuery、Splunk 既可以提供更丰富的查询,又可以节省成本。但让我们看看其他人是否有使用 Cloud Logging 的解决方案。
  • 好的,我找到了您的客户团队,他们也想与您联系。请通过@google.com 给我发电子邮件——我的 Google 句柄与我的 Stack Overflow 句柄相同——我会将你与他们合并到一个线程中。

标签: stackdriver google-cloud-stackdriver


【解决方案1】:

我从事 Stackdriver Logging 工作,并使用过处理查询的代码。

你是对的:存在操作符 (:*) 有问题,它的工作方式与其他操作符不同。因此,否定存在运算符的行为不直观(或特别有用)。

我们认为这是一个错误,我真的很想修复它;但是,修复此类错误是一个漫长的过程,因此我提出了一些解决方法。

  1. 这是怎么回事?

我无法重现您的第一个“零结果”过滤器:resource.labels:* AND resource.labels.namespace_name:*

这为我提供了包含namespace_name 标签的大量日志列表。对于它的价值,resource.labels.namespace_name:* 意味着 resource.labels:*,所以实际上你只需要这个过滤器的后半部分。

您的第二个“零结果”过滤器:resource.labels:* AND NOT resource.labels.namespace_name:*

...遇到了一个错误,其中字段存在检查 (:*) 无法与否定正确交互。

  1. 更重要的是,如何排除 namespace_name 的特定值而不排除未定义 namespace_name 的记录?

虽然日志 API 不需要,但 GCP 发出的资源通常会发出 same sets of labels for a given resource type。您可以利用这一点,使用resource.type 将带标签的资源与不带标签的资源隔离开来,然后仅将标签约束应用于带标签的资源子句:

(resource.type != "k8s_container") OR
(resource.type = "k8s_container" AND resource.labels.namespace_name != "my-value")

在这里,我们依赖于所有带有namespace_name 标签的k8s_container 类型条目,通常情况下应该如此。您可以修改它以选择多个 Kubernetes 前缀资源:

(NOT resource.type:"k8s_") OR
(resource.type:"k8s_" AND resource.labels.namespace_name != "my-value")

...或使用复杂的resource.type 子句专门选择要从命名空间匹配中包含/排除的内容。

(NOT (resource.type = "k8s_container" OR resource.type = "k8s_pod")) OR
((resource.type = "k8s_container" OR resource.type = "k8s_pod") AND resource.labels.namespace_name != "my-value")

您不能查询没有 namespace_name 标签的 k8s_container 类型,但通常不应首先发出这些标签。

  1. 同样,如何为所有未定义 namespace_name 的记录编写过滤器?

由于该错误,您现在无法执行此操作。我认为您最好的选择是识别所有使用 namespace_nameresource types 并使用 resource.type 过滤器排除这些类型:

NOT (
  resource.type = "k8s_container" OR
  resource.type = "k8s_pod" OR
  resource.type = "knative_revision")

请注意,如前所述,虽然可能(API 允许)有一个没有namespace_name 标签的k8s_container 资源,但发出的k8s_container 日志通常应该有标签.

【讨论】:

  • 谢谢!将所有内容都下沉到 bigquery 或其他查询引擎会有帮助吗?
猜你喜欢
  • 1970-01-01
  • 2018-05-11
  • 1970-01-01
  • 2018-03-07
  • 2016-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多