Я работаю над ведением журнала Stackdriver и работал с кодом, который обрабатывает запросы.
Вы правы: что-то не так с оператором присутствия (:*
), и работает не так, как другие операторы. В результате поведение отрицательного оператора присутствия не является интуитивным (или особенно полезным).
Мы считаем это ошибкой, и это то, что я действительно хотел бы исправить; однако исправление этого класса ошибок - длительный процесс, поэтому я предложил некоторые обходные пути.
- Что здесь происходит?
Я не могу воспроизвести ваш первый фильтр с «нулевым результатом»: resource.labels:* AND resource.labels.namespace_name:*
Это дает мне большой список журналов, которые содержат метку namespace_name
. Что бы это ни стоило, resource.labels.namespace_name:*
подразумевает resource.labels:*
, так что на самом деле вам нужна только вторая половина этого фильтра.
Ваш второй фильтр с «нулевым результатом»: resource.labels:* AND NOT resource.labels.namespace_name:*
... приводит к ошибке, при которой проверка наличия поля (:*
) не взаимодействует должным образом с отрицанием.
- Что более важно, как я могу исключить определенное значение 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
, но, как правило, он вообще не должен генерироваться.
- Аналогично, как мне написать фильтр для всех записей, которые не определяют 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
обычно должны иметь метку.