deploy/platform/kubernetes/templates/feature-nginx-monitor/resources.yaml (201 lines of code) (raw):
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
{{- if .Values.features.nginxMonitor.enabled }}
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
data:
nginx.conf: |
worker_processes 1;
daemon off;
error_log /var/log/nginx/error.log notice;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
lua_shared_dict prometheus_metrics 10M;
# lua_package_path "/path/to/nginx-lua-prometheus/?.lua;;";
init_worker_by_lua_block {
prometheus = require("prometheus").init("prometheus_metrics")
metric_bytes = prometheus:counter(
"nginx_http_size_bytes", "Total size of HTTP", {"type", "route"})
metric_requests = prometheus:counter(
"nginx_http_requests_total", "Number of HTTP requests", {"status", "route"})
metric_latency = prometheus:histogram(
"nginx_http_latency", "HTTP request latency", {"route"})
metric_connections = prometheus:gauge(
"nginx_http_connections", "Number of HTTP connections", {"state"})
}
server {
listen 8080;
location /test {
default_type application/json;
return 200 '{"code": 200, "message": "success"}';
log_by_lua_block {
metric_bytes:inc(tonumber(ngx.var.request_length), {"request", "/test/**"})
metric_bytes:inc(tonumber(ngx.var.bytes_send), {"response", "/test/**"})
metric_requests:inc(1, {ngx.var.status, "/test/**"})
metric_latency:observe(tonumber(ngx.var.request_time), {"/test/**"})
}
}
location /test_404 {
default_type application/json;
return 404 '{"code": 404, "message": "404 NOT Found"}';
log_by_lua_block {
metric_bytes:inc(tonumber(ngx.var.request_length), {"request", "/test_404/**"})
metric_bytes:inc(tonumber(ngx.var.bytes_send), {"response", "/test_404/**"})
metric_requests:inc(1, {ngx.var.status, "/test_404/**"})
metric_latency:observe(tonumber(ngx.var.request_time), {"/test_404/**"})
}
}
location /test_500 {
default_type application/json;
return 500 '{"code": 500, "message": "500 Internal Server Error"}';
log_by_lua_block {
metric_bytes:inc(tonumber(ngx.var.request_length), {"request", "/test_500/**"})
metric_bytes:inc(tonumber(ngx.var.bytes_send), {"response", "/test_500/**"})
metric_requests:inc(1, {ngx.var.status, "/test_500/**"})
metric_latency:observe(tonumber(ngx.var.request_time), {"/test_500/**"})
}
}
}
server {
listen 9145;
location /metrics {
content_by_lua_block {
metric_connections:set(ngx.var.connections_reading, {"reading"})
metric_connections:set(ngx.var.connections_waiting, {"waiting"})
metric_connections:set(ngx.var.connections_writing, {"writing"})
prometheus:collect()
}
}
}
}
---
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-log-fluent-bit
data:
fluent-bit.conf: |
[SERVICE]
Flush 5
Daemon Off
Log_Level warn
[INPUT]
Name tail
Tag access
Path /var/log/nginx/access.log
[INPUT]
Name tail
Tag error
Path /var/log/nginx/error.log
[FILTER]
Name lua
Match access
Script fluent-bit-script.lua
Call rewrite_access_log
[FILTER]
Name lua
Match error
Script fluent-bit-script.lua
Call rewrite_error_log
[OUTPUT]
Name stdout
Match *
Format json
[OUTPUT]
Name http
Match *
Host {{ template "skywalking.oap.address.host" . }}
Port 12800
URI /v3/logs
Format json
fluent-bit-script.lua: |
function rewrite_access_log(tag, timestamp, record)
local newRecord = {}
newRecord["layer"] = "NGINX"
newRecord["service"] = "nginx::nginx.{{ .Release.Namespace }}"
newRecord["serviceInstance"] = os.getenv("SW_SERVICE_INSTANCE")
newRecord["body"] = { text = { text = record.log } }
newRecord["tags"] = { data = { { key = "LOG_KIND", value = "NGINX_ACCESS_LOG" } } }
return 1, timestamp, newRecord
end
function rewrite_error_log(tag, timestamp, record)
local newRecord = {}
newRecord["layer"] = "NGINX"
newRecord["service"] = "nginx::nginx.{{ .Release.Namespace }}"
newRecord["serviceInstance"] = os.getenv("SW_SERVICE_INSTANCE")
newRecord["body"] = { text = { text = record.log } }
newRecord["tags"] = { data = { { key = "LOG_KIND", value = "NGINX_ERROR_LOG" } } }
return 1, timestamp, newRecord
end
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
annotations:
sidecar.istio.io/inject: "false"
spec:
containers:
- name: nginx
image: openresty/openresty:1.17.8.2-5-alpine-fat
command: ["sh", "-c", "luarocks install nginx-lua-prometheus && openresty -c /var/nginx/conf.d/nginx.conf"]
ports:
- name: metrics
containerPort: 9145
volumeMounts:
- name: logs
mountPath: /var/log/nginx/
- name: nginx-config
mountPath: /var/nginx/conf.d/
- name: nginx-caller
image: openresty/openresty:1.17.8.2-5-alpine-fat
command: ["sh", "-c", "while true; do curl -o /dev/null -s http://localhost:8080/test; curl -o /dev/null -s http://localhost:8080/test_404; curl -o /dev/null -s http://localhost:8080/test_500; sleep 1s; done"]
- name: fluent-bit
image: fluent/fluent-bit:1.9
env:
- name: SW_SERVICE_INSTANCE
valueFrom:
fieldRef:
fieldPath: metadata.name
volumeMounts:
- name: logs
mountPath: /var/log/nginx/
- name: fluent-bit-config
mountPath: /fluent-bit/etc/
volumes:
- name: logs
emptyDir: {}
- name: nginx-config
configMap:
name: nginx-config
- name: fluent-bit-config
configMap:
name: nginx-log-fluent-bit
---
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
{{- end }}