Расширенный фильтр не может выразить ISNULL? - PullRequest
1 голос
/ 17 мая 2019

Эти два фильтра возвращают ноль результатов:

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

В то время как этот возвращает множество:

  • resource.labels:*

У меня есть три вопроса по этому поводу:

  1. Что здесь происходит?
  2. Что важнее, как мнеисключить определенное значение namespace_name, в то время как не исключая записи, которые не определяют namespace_name?
  3. Аналогично, как мне написать фильтр для всех записей, которые не определить namespace_name?

1 Ответ

2 голосов
/ 18 июня 2019

Я работаю над ведением журнала Stackdriver и работал с кодом, который обрабатывает запросы.

Вы правы: что-то не так с оператором присутствия (:*), и работает не так, как другие операторы. В результате поведение отрицательного оператора присутствия не является интуитивным (или особенно полезным).

Мы считаем это ошибкой, и это то, что я действительно хотел бы исправить; однако исправление этого класса ошибок - длительный процесс, поэтому я предложил некоторые обходные пути.

  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, обычно генерируют одинаковых наборов меток для данного типа ресурса . Вы можете воспользоваться этим, используя resource.type, чтобы изолировать ресурсы с меткой от ресурсов без метки, а затем применить ограничение метки только к предложению ресурсов с меткой:

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

Здесь мы полагаемся на все записи типа k8s_container, имеющие метку namespace_name, что, как правило, должно иметь место. Вы можете изменить это, чтобы выбрать несколько ресурсов с префиксом 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")

Вы не можете запросить тип k8s_container, у которого нет метки namespace_name, но, как правило, он вообще не должен генерироваться.

  1. Аналогично, как мне написать фильтр для всех записей, которые не определяют namespace_name?

Вы не можете сделать это прямо сейчас из-за ошибки. Я думаю, что вам лучше всего определить все типы ресурсов , которые используют namespace_name, и исключить эти типы с помощью фильтра resource.type:

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

Обратите внимание, что, как уже упоминалось ранее, хотя возможно (разрешено API) иметь ресурс k8s_container без метки namespace_name, отправленные журналы k8s_container обычно должны иметь метку.

...