| *********************************************************************** |
| Welcome to Grafana Loki |
| Chart version: {{ .Chart.Version }} |
| Chart Name: {{ .Chart.Name }} |
| Loki version: {{ .Chart.AppVersion }} |
| *********************************************************************** |
| |
| ** Please be patient while the chart is being deployed ** |
| |
| Tip: |
| |
| Watch the deployment status using the command: kubectl get pods -w --namespace {{ $.Release.Namespace }} |
| |
| If pods are taking too long to schedule make sure pod affinity can be fulfilled in the current cluster. |
| |
| *********************************************************************** |
| Installed components: |
| *********************************************************************** |
| |
| {{- if .Values.monitoring.selfMonitoring.enabled }} |
| * grafana-agent-operator |
| {{- end }} |
| {{- if eq (include "loki.deployment.isSingleBinary" .) "true" }} |
| * loki |
| {{- else -}} |
| {{- if .Values.gateway.enabled }} |
| * gateway |
| {{- end }} |
| {{- if .Values.minio.enabled }} |
| * minio |
| {{- end }} |
| {{- if eq (include "loki.deployment.isScalable" .) "true" }} |
| * read |
| * write |
| {{- if not .Values.read.legacyReadTarget }} |
| * backend |
| {{- end }} |
| {{- else }} |
| * compactor |
| * index gateway |
| * query scheduler |
| * ruler |
| * distributor |
| * ingester |
| * querier |
| * query frontend |
| {{- end }} |
| {{- end }} |
| |
| |
| {{- if eq (include "loki.deployment.isSingleBinary" .) "true" }} |
| |
| Loki has been deployed as a single binary. |
| This means a single pod is handling reads and writes. You can scale that pod vertically by adding more CPU and memory resources. |
| |
| {{- end }} |
| |
| |
| *********************************************************************** |
| Sending logs to Loki |
| *********************************************************************** |
| |
| {{- if .Values.gateway.enabled }} |
| |
| Loki has been configured with a gateway (nginx) to support reads and writes from a single component. |
| |
| {{- end }} |
| |
| You can send logs from inside the cluster using the cluster DNS: |
| |
| {{- if .Values.gateway.enabled }} |
| |
| http://{{ include "loki.gatewayFullname" . }}.{{ $.Release.Namespace }}.svc.cluster.local/loki/api/v1/push |
| |
| {{- else }} |
| {{- if eq (include "loki.deployment.isSingleBinary" .) "true" }} |
| |
| http://{{ include "loki.singleBinaryFullname" . }}.{{ $.Release.Namespace }}.svc.cluster.local:{{ .Values.loki.server.http_listen_port }}/loki/api/v1/push |
| |
| {{- end}} |
| {{- if eq (include "loki.deployment.isScalable" .) "true" }} |
| |
| http://{{ include "loki.writeFullname" . }}.{{ $.Release.Namespace }}.svc.cluster.local:{{ .Values.loki.server.http_listen_port }}/loki/api/v1/push |
| |
| {{- end }} |
| {{- if eq (include "loki.deployment.isDistributed" .) "true" }} |
| |
| http://{{ include "loki.distributorFullname" . }}.{{ $.Release.Namespace }}.svc.cluster.local:3100/loki/api/v1/push |
| |
| {{- end }} |
| {{- end }} |
| |
| You can test to send data from outside the cluster by port-forwarding the gateway to your local machine: |
| {{- if .Values.gateway.enabled }} |
| |
| kubectl port-forward --namespace {{ $.Release.Namespace }} svc/{{ include "loki.gatewayFullname" . }} 3100:{{ .Values.gateway.service.port }} & |
| |
| {{- else }} |
| {{- if eq (include "loki.deployment.isSingleBinary" .) "true" }} |
| |
| kubectl port-forward --namespace {{ $.Release.Namespace }} svc/{{ include "loki.singleBinaryFullname" . }} 3100:{{ .Values.loki.server.http_listen_port }} & |
| |
| {{- end}} |
| {{- if eq (include "loki.deployment.isScalable" .) "true" }} |
| |
| kubectl port-forward --namespace {{ $.Release.Namespace }} svc/{{ include "loki.writeFullname" . }} 3100:{{ .Values.loki.server.http_listen_port }} & |
| |
| {{- end }} |
| {{- if eq (include "loki.deployment.isDistributed" .) "true" }} |
| |
| kubectl port-forward --namespace {{ $.Release.Namespace }} svc/{{ include "loki.distributorFullname" . }} 3100:3100 & |
| |
| {{- end }} |
| {{- end }} |
| |
| And then using http://127.0.0.1:3100/loki/api/v1/push URL as shown below: |
| |
| ``` |
| curl -H "Content-Type: application/json" -XPOST -s "http://127.0.0.1:3100/loki/api/v1/push" \ |
| --data-raw "{\"streams\": [{\"stream\": {\"job\": \"test\"}, \"values\": [[\"$(date +%s)000000000\", \"fizzbuzz\"]]}]}" |
| {{- if .Values.loki.auth_enabled }} \ |
| -H X-Scope-OrgId:foo |
| {{- end}} |
| ``` |
| |
| Then verify that Loki did received the data using the following command: |
| |
| ``` |
| curl "http://127.0.0.1:3100/loki/api/v1/query_range" --data-urlencode 'query={job="test"}' {{- if .Values.loki.auth_enabled }} -H X-Scope-OrgId:foo {{- end}} | jq .data.result |
| ``` |
| |
| *********************************************************************** |
| Connecting Grafana to Loki |
| *********************************************************************** |
| |
| If Grafana operates within the cluster, you'll set up a new Loki datasource by utilizing the following URL: |
| |
| {{- if .Values.gateway.enabled }} |
| |
| http://{{ include "loki.gatewayFullname" . }}.{{ $.Release.Namespace }}.svc.cluster.local/ |
| |
| {{- else }} |
| {{- if eq (include "loki.deployment.isSingleBinary" .) "true" }} |
| |
| http://{{ include "loki.singleBinaryFullname" . }}.{{ $.Release.Namespace }}.svc.cluster.local:{{ .Values.loki.server.http_listen_port }}/ |
| |
| {{- end}} |
| {{- if eq (include "loki.deployment.isScalable" .) "true" }} |
| |
| http://{{ include "loki.readFullname" . }}.{{ $.Release.Namespace }}.svc.cluster.local:{{ .Values.loki.server.http_listen_port }}/ |
| |
| {{- end }} |
| {{- if eq (include "loki.deployment.isDistributed" .) "true" }} |
| |
| http://{{ include "loki.queryFrontendFullname" . }}.{{ $.Release.Namespace }}.svc.cluster.local:3100/ |
| |
| {{- end }} |
| {{- end }} |
| |
| |
| |
| {{- if .Values.loki.auth_enabled }} |
| |
| *********************************************************************** |
| Multi-tenancy |
| *********************************************************************** |
| |
| Loki is configured with auth enabled (multi-tenancy) and expects tenant headers (`X-Scope-OrgID`) to be set for all API calls. |
| |
| You must configure Grafana's Loki datasource using the `HTTP Headers` section with the `X-Scope-OrgID` to target a specific tenant. |
| For each tenant, you can create a different datasource. |
| |
| The agent of your choice must also be configured to propagate this header. |
| For example, when using Promtail you can use the `tenant` stage. https://grafana.com/docs/loki/latest/send-data/promtail/stages/tenant/ |
| |
| When not provided with the `X-Scope-OrgID` while auth is enabled, Loki will reject reads and writes with a 404 status code `no org id`. |
| |
| You can also use a reverse proxy, to automatically add the `X-Scope-OrgID` header as suggested by https://grafana.com/docs/loki/latest/operations/authentication/ |
| |
| For more information, read our documentation about multi-tenancy: https://grafana.com/docs/loki/latest/operations/multi-tenancy/ |
| |
| > When using curl you can pass `X-Scope-OrgId` header using `-H X-Scope-OrgId:foo` option, where foo can be replaced with the tenant of your choice. |
| |
| {{- end }} |