Я настраиваю кластер GKE для приложения со структурированной регистрацией json, которое очень хорошо работает с Kibana. Тем не менее, я хочу использовать вместо этого стекдрайвер.
Я вижу, что журналы приложения доступны в stackdriver со стандартными конфигурациями кластера. Журналы отображаются как jsonpayload, но я хочу большей гибкости и конфигурации, и когда я делаю это, следуя этому руководству , все журналы для одного и того же приложения отображаются только как textpayload. В конечном счете, я хочу, чтобы мои журналы продолжали отображаться в jsonpayload, когда я использую конфигурации агента Fluentd для использования преимуществ label_map .
Я следовал руководству по удалению службы ведения журналов по умолчанию и развертыванию агента Fluentd в существующем кластере со следующими версиями GKE.
Информация о версии Gcloud:
Google Cloud SDK 228.0.0
bq 2.0.39
core 2018.12.07
gsutil 4.34
Информация о версии kubectl:
Client Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.3", GitCommit:"2bba0127d85d5a46ab4b778548be28623b32d0b0", GitTreeState:"clean", BuildDate:"2018-05-21T09:17:39Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"10+", GitVersion:"v1.10.9-gke.5", GitCommit:"d776b4deeb3655fa4b8f4e8e7e4651d00c5f4a98", GitTreeState:"clean", BuildDate:"2018-11-08T20:33:00Z", GoVersion:"go1.9.3b4", Compiler:"gc", Platform:"linux/amd64"}
фрагмент кластера gcloud описывает фрагмент:
addonsConfig:
httpLoadBalancing: {}
kubernetesDashboard:
disabled: true
networkPolicyConfig:
disabled: true
createTime: '2018-12-24T19:31:21+00:00'
currentMasterVersion: 1.10.9-gke.5
currentNodeCount: 3
currentNodeVersion: 1.10.9-gke.5
initialClusterVersion: 1.10.9-gke.5
ipAllocationPolicy: {}
legacyAbac: {}
location: us-central1-a
locations:
- us-central1-a
loggingService: none
masterAuth:
username: admin
masterAuthorizedNetworksConfig: {}
monitoringService: monitoring.googleapis.com
name: test-cluster-1
network: default
networkConfig:
network: projects/test/global/networks/default
subnetwork: projects/test/regions/us-central1/subnetworks/default
networkPolicy: {}
nodeConfig:
diskSizeGb: 100
diskType: pd-standard
imageType: COS
machineType: n1-standard-1
serviceAccount: default
nodeIpv4CidrSize: 24
nodePools:
- autoscaling: {}
config:
diskSizeGb: 100
diskType: pd-standard
imageType: COS
machineType: n1-standard-1
serviceAccount: default
initialNodeCount: 3
management:
autoRepair: true
autoUpgrade: true
name: default-pool
status: RUNNING
version: 1.10.9-gke.5
status: RUNNING
subnetwork: default
zone: us-central1-a
Ниже приведено то, что включено в мою конфигурационную карту для демона fluentd:
<source>
type tail
format none
time_key time
path /var/log/containers/*.log
pos_file /var/log/gcp-containers.log.pos
time_format %Y-%m-%dT%H:%M:%S.%N%Z
tag reform.*
read_from_head true
</source>
<filter reform.**>
type parser
format json
reserve_data true
suppress_parse_error_log true
key_name log
</filter>
Вот пример журнала json из моего приложения:
{"log":"org.test.interceptor","lvl":"INFO","thread":"main","msg":"Inbound Message\n----------------------------\nID: 44\nResponse-Code: 401\nEncoding: UTF-8\nContent-Type: application/json;charset=UTF-8\nHeaders: {Date=[Mon, 31 Dec 2018 14:43:47 GMT], }\nPayload: {\"errorType\":\"AnException\",\"details\":[\"invalid credentials\"],\"message\":\"credentials are invalid\"}\n--------------------------------------","@timestamp":"2018-12-31T14:43:47.805+00:00","app":"the-app"}
Результат с вышеуказанной конфигурацией ниже:
{
insertId: "3vycfdg1drp34o"
labels: {
compute.googleapis.com/resource_name: "fluentd-gcp-v2.0-nds8d"
container.googleapis.com/namespace_name: "default"
container.googleapis.com/pod_name: "the-app-68fb6c5c8-mq5b5"
container.googleapis.com/stream: "stdout"
}
logName: "projects/test/logs/the-app"
receiveTimestamp: "2018-12-28T20:14:04.297451043Z"
resource: {
labels: {
cluster_name: "test-cluster-1"
container_name: "the-app"
instance_id: "234768123"
namespace_id: "default"
pod_id: "the-app-68fb6c5c8-mq5b5"
project_id: "test"
zone: "us-central1-a"
}
type: "container"
}
severity: "INFO"
textPayload: "org.test.interceptor"
timestamp: "2018-12-28T20:14:03Z"
}
Я даже пытался обернуть карту json в одно поле, поскольку кажется, что анализируется только поле «log». Я подумал о том, чтобы явно написать синтаксический анализатор, но это казалось невозможным, учитывая, что запись в журнале уже в формате json, а также изменение полей от вызова к вызову и необходимость предугадывать, какие поля анализировать, не будет идеальным.
Я ожидал, что все поля в моем журнале появятся в jsonPayload в записи журнала в стеке драйвера. В конечном итоге я хочу подражать тому, что происходит со службой стека-драйвера ведения журналов по умолчанию в кластере, где наши журналы, по крайней мере, выглядят как jsonPayload.