Я пытаюсь извлечь значение в конце этого журнала:
Chat request completed in 3.818780105999849
Это журнал, сохраненный в Google Cloud Logging, и сообщение записывается в поле textPayload. Я пытаюсь создать метрику на основе журнала, используя команду создания метрики журнала gcloud (документы найдены здесь). Поскольку я пытаюсь создать метрику распределения, мне необходимо создать файл конфигурации для этой метрики.
Вот что у меня есть для конфигурации json:
{
"name": "end-to-end-response-time-shell",
"description": "Time duration of a chat request (in seconds).",
"filter": "resource.type=\"cloud_run_revision\" AND logName=\"log_name\" AND severity=\"INFO\" AND textPayload=~\"Chat request completed in\"",
"metricDescriptor": {
"name": "cloud_run_revision",
"type": "logging.googleapis.com/user/end-to-end-response-time-shell",
"metricKind": "CUMULATIVE",
"valueType": "DISTRIBUTION",
"unit": "s",
"description": "Time duration of a chat request (in seconds).",
"displayName": "end-to-end-response-time-shell (sec)"
},
"valueExtractor": "REGEXP_EXTRACT(textPayload, \"\\s(\\d+\\.*\\d*)\\s\")"
}
Команда выдает ошибку в поле valueExtractor со следующим сообщением об ошибке:
ERROR: (gcloud.logging.metrics.create) INVALID_ARGUMENT: Failed to parse extractor expression: syntax error at line 1, column 29, token '"\s(\d+\.*\d*)\s"'
Как мне написать выражение регулярного выражения для этой задачи?
@DazWilkin Вы абсолютно правы, я добавил лишний )"
при создании вопроса, это моя вина. Но на самом деле у меня это было как "REGEXP_EXTRACT(textPayload, \"\\s(\\d+\\.*\\d*)\\s\")"
, и это все равно выдавало ошибку.
Я думаю, вам придется дважды экранировать (да!) RegEx. В документации для REGEXP_EXTRACT значение RegEx экранируется в строке. Вам придется повторно экранировать его для экранированной строки в JSON..... например. \\\\s
и \\\\d
и т. д.
ПРИМЕЧАНИЕ Отличный API-интерфейс Explorer от Google предоставляет альтернативный механизм для тестирования этого метода projects.metrics.create наряду с определениями типов.
@DazWilkin Твой четверной побег сработал!! Пожалуйста, отметьте это как ответ. Еще раз спасибо за вашу помощь.
Я думаю, вам придется дважды экранировать (да!) RegEx.
В документации для REGEXP_EXTRACT значение RegEx экранируется в строке.
Вы захотите повторно экранировать его для экранированной строки в JSON..... например. \\\\s
и \\\\d
и т. д.
Ух... вложенные и экранированные регулярные выражения... весело! Это неверный JSON.... Я думаю, вам либо (!?) нужна обратная косая черта перед предпоследним "... Не последним", который завершает значение JSON, а перед ним, который завершает значение REGEXP_EXTRACT (\"... \"), или у тебя их слишком много
)"