Назад | Перейти на главную страницу

Stackdriver Logging не распознает поле времени в журнале JSON

Я использую Google Kubernetes Engine (GKE) в сочетании со Stackdriver Logging.

Документация Stackdriver говорит, что агент ведения журнала использует некоторые специальные поля для установки полей в объекте LogEntry.

Что касается severity поле, работает нормально. Тем не мение, time поле работает не так, как задумано.

Следующий JSON - это журнал ошибок MySQL, который был изменен и перенаправлен на стандартный вывод:

(украшено и аннотировано для ясности)

{
  "prio": 0,
  "err_code": 11323,
  "component": "mysqlx",
  "source_line": 154,
  "source_file": "socket_acceptors_task.cc",
  "function": "show_startup_log",
  "msg": "X Plugin ready for connections. Socket: '/var/run/mysqld/mysqlx.sock' bind-address: '::' port: 33060",
  "err_symbol": "ER_XPLUGIN_LISTENER_STATUS_MSG",
  "SQL_state": "HY000",
  "subsystem": "Server",
  "label": "System",

  // Added for Stackdriver Logging
  "severity": "INFO",
  "time": "1548054692.636",

  // This is the same time written in human-readable format.
  "time.readable": "2019-01-21T07:11:32.636761Z"
}

И следующее - соответствующий журнал, записанный Stackdriver Logging:

(украшено и аннотировано для ясности)

{
  "insertId": "1jibhqgfw4kum0",
  "jsonPayload": {
    // Both `severity` and `time` fields were removed.

    "msg": "X Plugin ready for connections. Socket: '/var/run/mysqld/mysqlx.sock' bind-address: '::' port: 33060",
    "label": "System",
    "prio": 0,
    "err_code": 11323,
    "time.readable": "2019-01-21T07:11:32.636761Z",
    "subsystem": "Server",
    "source_file": "socket_acceptors_task.cc",
    "err_symbol": "ER_XPLUGIN_LISTENER_STATUS_MSG",
    "function": "show_startup_log",
    "SQL_state": "HY000",
    "source_line": 154,
    "component": "mysqlx"
  },
  "resource": {
    "type": "container",
    "labels": {
      "namespace_id": "myproject",
      "instance_id": "506697609301173766",
      "zone": "asia-east1-b",
      "pod_id": "demo-demoid1234567890-sns7g",
      "project_id": "harai-development",
      "cluster_name": "myproject",
      "container_name": "mysql-errorlog-output"
    }
  },

  // `timestamp` doesn't reflect the value in the original log,
  // which is "2019-01-21T07:11:32.636761Z".
  "timestamp": "2019-01-21T07:11:44Z",

  // `severity` reflects the value in the original log
  "severity": "INFO",

  "labels": {
    "compute.googleapis.com/resource_name": "fluentd-gcp-v3.1.0-pwc9k",
    "container.googleapis.com/pod_name": "demo-demoid1234567890-sns7g",
    "container.googleapis.com/stream": "stdout",
    "container.googleapis.com/namespace_name": "myproject"
  },
  "logName": "projects/harai-development/logs/mysql-errorlog-output",
  "receiveTimestamp": "2019-01-21T07:11:49.560205566Z"
}

Хотя оба time и severity поля были удалены, timestamp поле в LogEntry не отражает время, указанное в исходном time поле.

Как я могу установить timestamp к моменту создания журнала?

В конфигурации Fluentd для кластера GKE формат времени определяется следующим образом:

time_format %Y-%m-%dT%H:%M:%S.%NZ

Следовательно, он будет работать должным образом, если time поле как "2019-01-21T07:11:32.636761000Z".

Ссылка: https://issuetracker.google.com/issues/123303610