mirror of https://github.com/knative/docs.git
Redundant content
This commit is contained in:
parent
fc35fa2a0b
commit
460e53e5ef
|
@ -1,377 +0,0 @@
|
||||||
# Logs and metrics
|
|
||||||
|
|
||||||
## Monitoring components setup
|
|
||||||
|
|
||||||
First, deploy monitoring components.
|
|
||||||
|
|
||||||
### Elasticsearch, Kibana, Prometheus, and Grafana Setup
|
|
||||||
|
|
||||||
You can use two different setups:
|
|
||||||
|
|
||||||
1. **150-elasticsearch-prod**: This configuration collects logs & metrics from
|
|
||||||
user containers, build controller and Istio requests.
|
|
||||||
|
|
||||||
```shell
|
|
||||||
kubectl apply -R -f config/monitoring/100-common \
|
|
||||||
-f config/monitoring/150-elasticsearch-prod \
|
|
||||||
-f third_party/config/monitoring/common \
|
|
||||||
-f third_party/config/monitoring/elasticsearch \
|
|
||||||
-f config/monitoring/200-common \
|
|
||||||
-f config/monitoring/200-common/100-istio.yaml
|
|
||||||
```
|
|
||||||
|
|
||||||
1. **150-elasticsearch-dev**: This configuration collects everything **150
|
|
||||||
-elasticsearch-prod** does, plus Knative Serving controller logs.
|
|
||||||
|
|
||||||
```shell
|
|
||||||
kubectl apply -R -f config/monitoring/100-common \
|
|
||||||
-f config/monitoring/150-elasticsearch-dev \
|
|
||||||
-f third_party/config/monitoring/common \
|
|
||||||
-f third_party/config/monitoring/elasticsearch \
|
|
||||||
-f config/monitoring/200-common \
|
|
||||||
-f config/monitoring/200-common/100-istio.yaml
|
|
||||||
```
|
|
||||||
|
|
||||||
### Stackdriver, Prometheus, and Grafana Setup
|
|
||||||
|
|
||||||
If your Knative Serving is not built on a Google Cloud Platform based cluster,
|
|
||||||
or you want to send logs to another GCP project, you need to build your own
|
|
||||||
Fluentd image and modify the configuration first. See
|
|
||||||
|
|
||||||
1. [Fluentd image on Knative Serving](/image/fluentd/README.md)
|
|
||||||
2. [Setting up a logging plugin](setting-up-a-logging-plugin.md)
|
|
||||||
|
|
||||||
Then you can use two different setups:
|
|
||||||
|
|
||||||
1. **150-stackdriver-prod**: This configuration collects logs and metrics from
|
|
||||||
user containers, build controller, and Istio requests.
|
|
||||||
|
|
||||||
```shell
|
|
||||||
kubectl apply -R -f config/monitoring/100-common \
|
|
||||||
-f config/monitoring/150-stackdriver-prod \
|
|
||||||
-f third_party/config/monitoring/common \
|
|
||||||
-f config/monitoring/200-common \
|
|
||||||
-f config/monitoring/200-common/100-istio.yaml
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **150-stackdriver-dev**: This configuration collects everything **150
|
|
||||||
-stackdriver-prod** does, plus Knative Serving controller logs.
|
|
||||||
|
|
||||||
```shell
|
|
||||||
kubectl apply -R -f config/monitoring/100-common \
|
|
||||||
-f config/monitoring/150-stackdriver-dev \
|
|
||||||
-f third_party/config/monitoring/common \
|
|
||||||
-f config/monitoring/200-common \
|
|
||||||
-f config/monitoring/200-common/100-istio.yaml
|
|
||||||
```
|
|
||||||
|
|
||||||
## Accessing logs
|
|
||||||
|
|
||||||
### Kibana and Elasticsearch
|
|
||||||
|
|
||||||
To open the Kibana UI (the visualization tool for [Elasticsearch](https://info.elastic.co),
|
|
||||||
enter the following command:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
kubectl proxy
|
|
||||||
```
|
|
||||||
|
|
||||||
This starts a local proxy of Kibana on port 8001. The Kibana UI is only exposed within
|
|
||||||
the cluster for security reasons.
|
|
||||||
|
|
||||||
Navigate to the [Kibana UI](http://localhost:8001/api/v1/namespaces/monitoring/services/kibana-logging/proxy/app/kibana)
|
|
||||||
(*It might take a couple of minutes for the proxy to work*).
|
|
||||||
|
|
||||||
When Kibana is opened the first time, it will ask you to create an index.
|
|
||||||
Accept the default options:
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
The Discover tab of the Kibana UI looks like this:
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
You can change the time frame of logs Kibana displays in the upper right corner
|
|
||||||
of the screen. The main search bar is across the top of the Dicover page.
|
|
||||||
|
|
||||||
As more logs are ingested, new fields will be discovered. To have them indexed,
|
|
||||||
go to Management > Index Patterns > Refresh button (on top right) > Refresh
|
|
||||||
fields.
|
|
||||||
|
|
||||||
<!-- TODO: create a video walkthrough of the Kibana UI -->
|
|
||||||
|
|
||||||
#### Accessing configuration and revision logs
|
|
||||||
|
|
||||||
To access the logs for a configuration, enter the following search query in Kibana:
|
|
||||||
|
|
||||||
```
|
|
||||||
kubernetes.labels.knative_dev\/configuration: "configuration-example"
|
|
||||||
```
|
|
||||||
|
|
||||||
Replace `configuration-example` with your configuration's name. Enter the following
|
|
||||||
command to get your configuration's name:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
kubectl get configurations
|
|
||||||
```
|
|
||||||
|
|
||||||
To access logs for a revision, enter the following search query in Kibana:
|
|
||||||
|
|
||||||
```
|
|
||||||
kubernetes.labels.knative_dev\/revision: "configuration-example-00001"
|
|
||||||
```
|
|
||||||
|
|
||||||
Replace `configuration-example-00001` with your revision's name.
|
|
||||||
|
|
||||||
#### Accessing build logs
|
|
||||||
|
|
||||||
To access the logs for a build, enter the following search query in Kibana:
|
|
||||||
|
|
||||||
```
|
|
||||||
kubernetes.labels.build\-name: "test-build"
|
|
||||||
```
|
|
||||||
|
|
||||||
Replace `test-build` with your build's name. The build name is specified in the `.yaml` file as follows:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
apiVersion: build.knative.dev/v1alpha1
|
|
||||||
kind: Build
|
|
||||||
metadata:
|
|
||||||
name: test-build
|
|
||||||
```
|
|
||||||
|
|
||||||
### Stackdriver
|
|
||||||
|
|
||||||
Go to the [Google Cloud Console logging page](https://console.cloud.google.com/logs/viewer) for
|
|
||||||
your GCP project which stores your logs via Stackdriver.
|
|
||||||
|
|
||||||
## Accessing metrics
|
|
||||||
|
|
||||||
Enter:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
kubectl port-forward -n monitoring $(kubectl get pods -n monitoring --selector=app=grafana --output=jsonpath="{.items..metadata.name}") 3000
|
|
||||||
```
|
|
||||||
|
|
||||||
Then open the Grafana UI at [http://localhost:3000](http://localhost:3000). The following dashboards are
|
|
||||||
pre-installed with Knative Serving:
|
|
||||||
|
|
||||||
* **Revision HTTP Requests:** HTTP request count, latency and size metrics per revision and per configuration
|
|
||||||
* **Nodes:** CPU, memory, network and disk metrics at node level
|
|
||||||
* **Pods:** CPU, memory and network metrics at pod level
|
|
||||||
* **Deployment:** CPU, memory and network metrics aggregated at deployment level
|
|
||||||
* **Istio, Mixer and Pilot:** Detailed Istio mesh, Mixer and Pilot metrics
|
|
||||||
* **Kubernetes:** Dashboards giving insights into cluster health, deployments and capacity usage
|
|
||||||
|
|
||||||
### Accessing per request traces
|
|
||||||
|
|
||||||
Before you can view per request metrics, you'll need to create a new index pattern that will store
|
|
||||||
per request traces captured by Zipkin:
|
|
||||||
|
|
||||||
1. Start the Kibana UI serving on local port 8001 by entering the following command:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
kubectl proxy
|
|
||||||
```
|
|
||||||
|
|
||||||
1. Open the [Kibana UI](http://localhost:8001/api/v1/namespaces/monitoring/services/kibana-logging/proxy/app/kibana).
|
|
||||||
|
|
||||||
1. Navigate to Management -> Index Patterns -> Create Index Pattern.
|
|
||||||
|
|
||||||
1. Enter `zipkin*` in the "Index pattern" text field.
|
|
||||||
|
|
||||||
1. Click **Create**.
|
|
||||||
|
|
||||||
After you've created the Zipkin index pattern, open the
|
|
||||||
[Zipkin UI](http://localhost:8001/api/v1/namespaces/istio-system/services/zipkin:9411/proxy/zipkin/).
|
|
||||||
Click on "Find Traces" to see the latest traces. You can search for a trace ID
|
|
||||||
or look at traces of a specific application. Click on a trace to see a detailed
|
|
||||||
view of a specific call.
|
|
||||||
|
|
||||||
To see a demo of distributed tracing, deploy the
|
|
||||||
[Telemetry sample](../sample/telemetrysample/README.md), send some traffic to it,
|
|
||||||
then explore the traces it generates from Zipkin UI.
|
|
||||||
|
|
||||||
<!--TODO: Consider adding a video here. -->
|
|
||||||
|
|
||||||
## Default metrics
|
|
||||||
|
|
||||||
The following metrics are collected by default:
|
|
||||||
* Knative Serving controller metrics
|
|
||||||
* Istio metrics (mixer, envoy and pilot)
|
|
||||||
* Node and pod metrics
|
|
||||||
|
|
||||||
There are several other collectors that are pre-configured but not enabled.
|
|
||||||
To see the full list, browse to config/monitoring/prometheus-exporter
|
|
||||||
and config/monitoring/prometheus-servicemonitor folders and deploy them
|
|
||||||
using `kubectl apply -f`.
|
|
||||||
|
|
||||||
## Default logs
|
|
||||||
|
|
||||||
Deployment above enables collection of the following logs:
|
|
||||||
|
|
||||||
* stdout & stderr from all user-container
|
|
||||||
* stdout & stderr from build-controller
|
|
||||||
|
|
||||||
To enable log collection from other containers and destinations, see
|
|
||||||
[setting up a logging plugin](setting-up-a-logging-plugin.md).
|
|
||||||
|
|
||||||
## Metrics troubleshooting
|
|
||||||
|
|
||||||
You can use the Prometheus web UI to troubleshoot publishing and service
|
|
||||||
discovery issues for metrics. To access to the web UI, forward the Prometheus
|
|
||||||
server to your machine:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
kubectl port-forward -n monitoring $(kubectl get pods -n monitoring --selector=app=prometheus --output=jsonpath="{.items[0].metadata.name}") 9090
|
|
||||||
```
|
|
||||||
|
|
||||||
Then browse to http://localhost:9090 to access the UI.
|
|
||||||
|
|
||||||
* To see the targets that are being scraped, go to Status -> Targets
|
|
||||||
* To see what Prometheus service discovery is picking up vs. dropping, go to Status -> Service Discovery
|
|
||||||
|
|
||||||
## Generating metrics
|
|
||||||
|
|
||||||
If you want to send metrics from your controller, follow the steps below. These
|
|
||||||
steps are already applied to autoscaler and controller. For those controllers,
|
|
||||||
simply add your new metric definitions to the `view`, create new `tag.Key`s if
|
|
||||||
necessary and instrument your code as described in step 3.
|
|
||||||
|
|
||||||
In the example below, we will setup the service to host the metrics and
|
|
||||||
instrument a sample 'Gauge' type metric using the setup.
|
|
||||||
|
|
||||||
1. First, go through [OpenCensus Go Documentation](https://godoc.org/go.opencensus.io).
|
|
||||||
2. Add the following to your application startup:
|
|
||||||
|
|
||||||
```go
|
|
||||||
import (
|
|
||||||
"net/http"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"go.opencensus.io/stats"
|
|
||||||
"go.opencensus.io/stats/view"
|
|
||||||
"go.opencensus.io/tag"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
desiredPodCountM *stats.Int64Measure
|
|
||||||
namespaceTagKey tag.Key
|
|
||||||
revisionTagKey tag.Key
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
exporter, err := prometheus.NewExporter(prometheus.Options{Namespace: "{your metrics namespace (eg: autoscaler)}"})
|
|
||||||
if err != nil {
|
|
||||||
glog.Fatal(err)
|
|
||||||
}
|
|
||||||
view.RegisterExporter(exporter)
|
|
||||||
view.SetReportingPeriod(10 * time.Second)
|
|
||||||
|
|
||||||
// Create a sample gauge
|
|
||||||
var r = &Reporter{}
|
|
||||||
desiredPodCountM = stats.Int64(
|
|
||||||
"desired_pod_count",
|
|
||||||
"Number of pods autoscaler wants to allocate",
|
|
||||||
stats.UnitNone)
|
|
||||||
|
|
||||||
// Tag the statistics with namespace and revision labels
|
|
||||||
var err error
|
|
||||||
namespaceTagKey, err = tag.NewKey("namespace")
|
|
||||||
if err != nil {
|
|
||||||
// Error handling
|
|
||||||
}
|
|
||||||
revisionTagKey, err = tag.NewKey("revision")
|
|
||||||
if err != nil {
|
|
||||||
// Error handling
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create view to see our measurement.
|
|
||||||
err = view.Register(
|
|
||||||
&view.View{
|
|
||||||
Description: "Number of pods autoscaler wants to allocate",
|
|
||||||
Measure: r.measurements[DesiredPodCountM],
|
|
||||||
Aggregation: view.LastValue(),
|
|
||||||
TagKeys: []tag.Key{namespaceTagKey, configTagKey, revisionTagKey},
|
|
||||||
},
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
// Error handling
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start the endpoint for Prometheus scraping
|
|
||||||
mux := http.NewServeMux()
|
|
||||||
mux.Handle("/metrics", exporter)
|
|
||||||
http.ListenAndServe(":8080", mux)
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
3. In your code where you want to instrument, set the counter with the
|
|
||||||
appropriate label values - example:
|
|
||||||
|
|
||||||
```go
|
|
||||||
ctx := context.TODO()
|
|
||||||
tag.New(
|
|
||||||
ctx,
|
|
||||||
tag.Insert(namespaceTagKey, namespace),
|
|
||||||
tag.Insert(revisionTagKey, revision))
|
|
||||||
stats.Record(ctx, desiredPodCountM.M({Measurement Value}))
|
|
||||||
```
|
|
||||||
|
|
||||||
4. Add the following to scape config file located at
|
|
||||||
config/monitoring/200-common/300-prometheus/100-scrape-config.yaml:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
- job_name: <YOUR SERVICE NAME>
|
|
||||||
kubernetes_sd_configs:
|
|
||||||
- role: endpoints
|
|
||||||
relabel_configs:
|
|
||||||
# Scrape only the the targets matching the following metadata
|
|
||||||
- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_label_app, __meta_kubernetes_endpoint_port_name]
|
|
||||||
action: keep
|
|
||||||
regex: {SERVICE NAMESPACE};{APP LABEL};{PORT NAME}
|
|
||||||
# Rename metadata labels to be reader friendly
|
|
||||||
- source_labels: [__meta_kubernetes_namespace]
|
|
||||||
action: replace
|
|
||||||
regex: (.*)
|
|
||||||
target_label: namespace
|
|
||||||
replacement: $1
|
|
||||||
- source_labels: [__meta_kubernetes_pod_name]
|
|
||||||
action: replace
|
|
||||||
regex: (.*)
|
|
||||||
target_label: pod
|
|
||||||
replacement: $1
|
|
||||||
- source_labels: [__meta_kubernetes_service_name]
|
|
||||||
action: replace
|
|
||||||
regex: (.*)
|
|
||||||
target_label: service
|
|
||||||
replacement: $1
|
|
||||||
```
|
|
||||||
|
|
||||||
5. Redeploy prometheus and its configuration:
|
|
||||||
```sh
|
|
||||||
kubectl delete -f config/monitoring/200-common/300-prometheus
|
|
||||||
kubectl apply -f config/monitoring/200-common/300-prometheus
|
|
||||||
```
|
|
||||||
|
|
||||||
6. Add a dashboard for your metrics - you can see examples of it under
|
|
||||||
config/grafana/dashboard-definition folder. An easy way to generate JSON
|
|
||||||
definitions is to use Grafana UI (make sure to login with as admin user) and
|
|
||||||
[export JSON](http://docs.grafana.org/reference/export_import) from it.
|
|
||||||
|
|
||||||
7. Validate the metrics flow either by Grafana UI or Prometheus UI (see
|
|
||||||
Troubleshooting section above to enable Prometheus UI)
|
|
||||||
|
|
||||||
## Distributed tracing with Zipkin
|
|
||||||
Check [Telemetry sample](../sample/telemetrysample/README.md) as an example usage of
|
|
||||||
[OpenZipkin](https://zipkin.io/pages/existing_instrumentations)'s Go client library.
|
|
||||||
|
|
||||||
## Delete monitoring components
|
|
||||||
Enter:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
ko delete --ignore-not-found=true \
|
|
||||||
-f config/monitoring/200-common/100-istio.yaml \
|
|
||||||
-f config/monitoring/200-common/100-zipkin.yaml \
|
|
||||||
-f config/monitoring/100-common
|
|
||||||
```
|
|
Loading…
Reference in New Issue