Add doc for EventExporter (#116)
diff --git a/docs/examples/event-exporter.md b/docs/examples/event-exporter.md
new file mode 100644
index 0000000..62714be
--- /dev/null
+++ b/docs/examples/event-exporter.md
@@ -0,0 +1,271 @@
+# SkyWalking Kubernetes Event Exporter User Guide
+
+[SkyWalking Kubernetes Event Exporter](https://github.com/apache/skywalking-kubernetes-event-exporter) is able to watch,
+filter, and send Kubernetes events into the Apache SkyWalking backend.
+
+## Demo
+
+### Step 1: Create a Local Kubernetes Cluster
+
+Please follow step 1 to 3 in [getting started](../getting-started.md) to create a cluster.
+
+### Step 2: Deploy OAP server and Event Exporter
+
+Create the `skywalking-system` namespace.
+
+```shell
+$ kubectl create namespace skywalking-system
+```
+
+Deploy an OAP server and an event exporter.
+
+```shell
+cat <<EOF | kubectl apply -f -
+apiVersion: operator.skywalking.apache.org/v1alpha1
+kind: OAPServer
+metadata:
+ name: skywalking-system
+ namespace: skywalking-system
+spec:
+ version: 9.5.0
+ instances: 1
+ image: apache/skywalking-oap-server:9.5.0
+ service:
+ template:
+ type: ClusterIP
+
+---
+apiVersion: operator.skywalking.apache.org/v1alpha1
+kind: EventExporter
+metadata:
+ name: skywalking-system
+ namespace: skywalking-system
+spec:
+ replicas: 1
+ config: |
+ filters:
+ - reason: ""
+ message: ""
+ minCount: 1
+ type: ""
+ action: ""
+ kind: "Pod|Service"
+ namespace: "^skywalking-system$"
+ name: ""
+ service: "[^\\s]{1,}"
+ exporters:
+ - skywalking
+ exporters:
+ skywalking:
+ template:
+ source:
+ service: "{{ .Service.Name }}"
+ serviceInstance: "{{ .Pod.Name }}"
+ endpoint: ""
+ message: "{{ .Event.Message }}"
+ address: "skywalking-system-oap.skywalking-system:11800"
+EOF
+```
+
+Wait until both components are ready...
+
+```shell
+$ kubectl get pod -n skywalking-system
+NAME READY STATUS RESTARTS AGE
+skywalking-system-eventexporter-566db46fb6-npx8v 1/1 Running 0 50s
+skywalking-system-oap-68bd877f57-zs8hw 1/1 Running 0 50s
+```
+
+### Step 3: Check Reported Events
+
+We can verify k8s events is reported to the OAP server by
+using [skywalking-cli](https://github.com/apache/skywalking-cli).
+
+First, port-forward the OAP http service to your local machine.
+
+```shell
+$ kubectl port-forward svc/skywalking-system-oap 12800:12800 -n skywalking-system
+```
+
+Next, use `swctl` to list reported events in YAML format.
+
+```shell
+$ swctl --display yaml event ls
+```
+
+The output should contain k8s events of the OAP server.
+
+```yaml
+events:
+ - uuid: 1d5bfe48-bc8d-4f5a-9680-188f59793459
+ source:
+ service: skywalking-system-oap
+ serviceinstance: skywalking-system-oap-68bd877f57-cvkjb
+ endpoint: ""
+ name: Pulled
+ type: Normal
+ message: Successfully pulled image "apache/skywalking-oap-server:9.5.0" in 6m4.108914335s
+ parameters: [ ]
+ starttime: 1713793327000
+ endtime: 1713793327000
+ layer: K8S
+ - uuid: f576f6ad-748d-4cec -9260-6587c145550e
+ source:
+ service: skywalking-system-oap
+ serviceinstance: skywalking-system-oap-68bd877f57-cvkjb
+ endpoint: ""
+ name: Created
+ type: Normal
+ message: Created container oap
+ parameters: [ ]
+ starttime: 1713793327000
+ endtime: 1713793327000
+ layer: K8S
+ - uuid: 0cec5b55-4cb0-4ff7-a670-a097609c531f
+ source:
+ service: skywalking-system-oap
+ serviceinstance: skywalking-system-oap-68bd877f57-cvkjb
+ endpoint: ""
+ name: Started
+ type: Normal
+ message: Started container oap
+ parameters: [ ]
+ starttime: 1713793327000
+ endtime: 1713793327000
+ layer: K8S
+ - uuid: 28f0d004-befe-4c27-a7b7-dfdc4dd755fa
+ source:
+ service: skywalking-system-oap
+ serviceinstance: skywalking-system-oap-68bd877f57-cvkjb
+ endpoint: ""
+ name: Pulling
+ type: Normal
+ message: Pulling image "apache/skywalking-oap-server:9.5.0"
+ parameters: [ ]
+ starttime: 1713792963000
+ endtime: 1713792963000
+ layer: K8S
+ - uuid: 6d766801-5057-42c0-aa63-93ce1e201418
+ source:
+ service: skywalking-system-oap
+ serviceinstance: skywalking-system-oap-68bd877f57-cvkjb
+ endpoint: ""
+ name: Scheduled
+ type: Normal
+ message: Successfully assigned skywalking-system/skywalking-system-oap-68bd877f57-cvkjb
+ to kind-worker
+ parameters: [ ]
+ starttime: 1713792963000
+ endtime: 1713792963000
+ layer: K8S
+```
+
+We can also verify by checking logs of the event exporter.
+
+```shell
+kubectl logs -f skywalking-system-eventexporter-566db46fb6-npx8v -n skywalking-system
+...
+DEBUG done: rendered event is: uuid:"8d8c2bd1-1812-4b0c-8237-560688366280" source:{service:"skywalking-system-oap" serviceInstance:"skywalking-system-oap-68bd877f57-zs8hw"} name:"Started" message:"Started container oap" startTime:1713795214000 endTime:1713795214000 layer:"K8S"
+```
+
+## Spec
+
+| name | description | default value |
+|----------|--------------------------------------------------------|------------------------------------------------------|
+| image | Docker image of the event exporter. | `apache/skywalking-kubernetes-event-exporter:latest` |
+| replicas | Number of event exporter pods. | `1` |
+| config | Configuration of filters and exporters in YAML format. | `""` |
+
+Please note: if you ignore the `config` field, no filters or exporter will be created.
+
+This is because the EventExporter controller creates a configMap for all `config` values and
+attach the configMap to the event exporter container as configuration file.
+Ignoring the `config` field means an **empty** configuration file (with content `""`) is provided to the event exporter.
+
+## Status
+
+| name | description |
+|-------------------|----------------------------------------------------------------------------|
+| availableReplicas | Total number of available event exporter pods. |
+| conditions | Latest available observations of the underlying deployment's current state |
+| configMapName | Name of the underlying configMap. |
+
+## Configuration
+
+The event exporter supports reporting specific events by different exporters.
+We can add filter configs to choose which events we are interested in,
+and include exporter names in each filter config to tell event exporter how to export filtered events.
+
+An example configuration is listed below:
+
+```yaml
+filters:
+ - reason: ""
+ message: ""
+ minCount: 1
+ type: ""
+ action: ""
+ kind: "Pod|Service"
+ namespace: "^default$"
+ name: ""
+ service: "[^\\s]{1,}"
+ exporters:
+ - skywalking
+
+exporters:
+ skywalking:
+ template:
+ source:
+ service: "{{ .Service.Name }}"
+ serviceInstance: "{{ .Pod.Name }}"
+ endpoint: ""
+ message: "{{ .Event.Message }}"
+ address: "skywalking-system-oap.skywalking-system:11800"
+```
+
+### Filter Config
+
+| name | description | example |
+|-----------|-------------------------------------------------------------------------------------------------------------------------------------|------------------|
+| reason | Filter events of the specified reason, regular expression like `"Killing\|Killed"` is supported. | `""` |
+| message | Filter events of the specified message, regular expression like `"Pulling container.*"` is supported. | `""` |
+| minCount | Filter events whose count is >= the specified value. | `1` |
+| type | Filter events of the specified type, regular expression like `"Normal\|Error"` is supported. | `""` |
+| action | Filter events of the specified action, regular expression is supported. | `""` |
+| kind | Filter events of the specified kind, regular expression like `"Pod\|Service"` is supported. | `"Pod\|Service"` |
+| namespace | Filter events from the specified namespace, regular expression like `"default\|bookinfo"` is supported, empty means all namespaces. | `"^default$"` |
+| name | Filter events of the specified involved object name, regular expression like `".*bookinfo.*"` is supported. | `""` |
+| service | Filter events belonging to services whose name is not empty. | `"[^\\s]{1,}"` |
+| exporters | Events satisfy this filter can be exported into several exporters that are defined below. | `["skywalking"]` |
+
+### Skywalking Exporter Config
+
+SkyWalking exporter exports the events into Apache SkyWalking OAP server using grpc.
+
+| name | description | example |
+|---------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------|
+| address | The SkyWalking backend address where this exporter will export to. | `"skywalking-system-oap.skywalking-system:11800"` |
+| enableTLS | Whether to use TLS for grpc server connection validation. <br/> If TLS is enabled, the `trustedCertPath` is required, but `clientCertPath` and `clientKeyPath` are optional. | `false` |
+| clientCertPath | Path of the X.509 certificate file. | `""` |
+| clientKeyPath | Path of the X.509 private key file. | `""` |
+| trustedCertPath | Path of the root certificate file. | `""` |
+| insecureSkipVerify | Whether a client verifies the server's certificate chain and host name. Check [`tls.Config`](https://pkg.go.dev/crypto/tls#Config) for more details. | `false` |
+| template | The event template of SkyWalking exporter, it can be composed of metadata like Event, Pod, and Service. | |
+| template.source | Event source information. | |
+| template.source.service | Service name, can be a [template string](https://pkg.go.dev/text/template). | `"{{ .Service.Name }}"` |
+| template.source.serviceInstance | Service instance name, can be a [template string](https://pkg.go.dev/text/template). | `"{{ .Pod.Name }}"` |
+| template.source.endpoint | Endpoint, can be a [template string](https://pkg.go.dev/text/template). | `""` |
+| template.message | Message format, can be a [template string](https://pkg.go.dev/text/template). | `"{{ .Event.Message }}"` |
+
+### Console Exporter Config
+
+Console exporter exports the events into console logs, this exporter is typically used for debugging.
+
+| name | description | example |
+|---------------------------------|---------------------------------------------------------------------------------------------------------|--------------------------|
+| template | The event template of SkyWalking exporter, it can be composed of metadata like Event, Pod, and Service. | |
+| template.source | Event source information. | |
+| template.source.service | Service name, can be a [template string](https://pkg.go.dev/text/template). | `"{{ .Service.Name }}"` |
+| template.source.serviceInstance | Service instance name, can be a [template string](https://pkg.go.dev/text/template). | `"{{ .Pod.Name }}"` |
+| template.source.endpoint | Endpoint, can be a [template string](https://pkg.go.dev/text/template). | `""` |
+| template.message | Message format, can be a [template string](https://pkg.go.dev/text/template). | `"{{ .Event.Message }}"` |
\ No newline at end of file
diff --git a/docs/menu.yml b/docs/menu.yml
index b5a91e9..ea26974 100644
--- a/docs/menu.yml
+++ b/docs/menu.yml
@@ -42,6 +42,8 @@
path: "/examples/istio-controlplane"
- name: "Install Satellite"
path: "/examples/satellite"
+ - name: "Deploy Event Exporter"
+ path: "/examples/event-exporter"
- name: "Contributing Guides"
catalog:
- name: "Contribute"