Skip to content

Commit 06a854e

Browse files
committed
Initial commit
1 parent ebe7cc3 commit 06a854e

20 files changed

+45118
-0
lines changed

.env

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# Image info
2+
IMAGE_VERSION=0.1.0
3+
IMAGE_NAME=otel-target-allocator-talk
4+
5+
CONTEXT=./src/python

.gitignore

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
venv*
2+
pyenv.cfg
3+
*example*
4+
.DS_Store
5+
otelcol-config-extras*.yml

README.md

+31
Original file line numberDiff line numberDiff line change
@@ -1 +1,32 @@
11
# otel-target-allocator-talk
2+
3+
## Installation
4+
5+
### 1- Install KinD and set up k8s cluster
6+
7+
The scripts below will install KinD, and then will install the following in the newly-created cluster:
8+
9+
* the `PodMonitor` and `ServiceMonitor` Prometheus CRs
10+
* `cert-manager` (an OTel Operator pre-requisite)
11+
* the OTel Operator.
12+
13+
```bash
14+
./src/scripts/01-install-kind.sh
15+
./src/scripts/02-k8s-setup.sh
16+
```
17+
18+
### 2- Build and deploy image
19+
20+
Build Docker image and deploy to KinD
21+
22+
```bash
23+
./src/scripts/03-build-and-deploy-images.sh
24+
```
25+
26+
### 3- Kubernetes deployment
27+
28+
Deploy Kubernetes resources
29+
30+
```bash
31+
./src/scripts/04-deploy-resources.sh
32+
```

docker-compose.yml

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
version: '0.1'
2+
x-default-logging: &logging
3+
options:
4+
max-size: "5m"
5+
max-file: "2"
6+
7+
networks:
8+
default:
9+
name: otel-lab
10+
driver: bridge
11+
12+
services:
13+
14+
py-ta-example:
15+
container_name: py-ta-example
16+
image: ${IMAGE_NAME}:${IMAGE_VERSION}-py-ta-example
17+
build:
18+
context: ${CONTEXT}
19+
dockerfile: Dockerfile.app
20+
ports:
21+
- "8080:8080"
22+
# environment:
23+
# - OTEL_RESOURCE_ATTRIBUTES=service.name=py-ta-example,service.version=0.1.0
24+
stop_grace_period: 1s
25+
26+
# py-otel-client:
27+
# container_name: py-otel-client
28+
# image: ${IMAGE_NAME}:${IMAGE_VERSION}-py-otel-client
29+
# build:
30+
# context: ${CONTEXT}
31+
# dockerfile: Dockerfile.client
32+
# depends_on:
33+
# py-otel-server:
34+
# condition: service_started
35+
# environment:
36+
# - DESTINATION_URL=http://py-otel-server:8082/rolldice
37+
# stop_grace_period: 1s
38+
# py-otel-server:
39+
# container_name: py-otel-server
40+
# image: ${IMAGE_NAME}:${IMAGE_VERSION}-py-otel-server
41+
# build:
42+
# context: ${CONTEXT}
43+
# dockerfile: Dockerfile.server
44+
# ports:
45+
# - "8082:8082"
46+
# environment:
47+
# - OTEL_RESOURCE_ATTRIBUTES=service.name=py-otel-server,service.version=0.1.0
48+
# stop_grace_period: 1s

src/python/Dockerfile.app

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
FROM python:3.10-slim
2+
3+
EXPOSE 8080
4+
5+
WORKDIR /app
6+
COPY ./requirements.txt ./app.py .
7+
RUN pip3 install -r ./requirements.txt
8+
9+
CMD ["python", "app.py"]

src/python/README.md

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Python App
2+
3+
## Setup
4+
5+
Set up the Python environment
6+
7+
```bash
8+
python3 -m venv src/python/venv
9+
source src/python/venv/bin/activate
10+
11+
pip install --upgrade pip
12+
13+
# Installs dependencies
14+
pip install -r solution/python/requirements.txt
15+
# opentelemetry-bootstrap -a install
16+
```
17+

src/python/app.py

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import random
2+
import time
3+
from prometheus_client import start_http_server, Counter
4+
5+
some_counter = Counter(name="some_counter", documentation="Sample counter")
6+
7+
def main() -> None:
8+
while True:
9+
random_sleep_time = random.randint(1, 20)
10+
print(f"Sleeping for {random_sleep_time} seconds", flush=True)
11+
time.sleep(random_sleep_time)
12+
some_counter.inc()
13+
14+
if __name__ == "__main__":
15+
start_http_server(port=8080)
16+
main()

src/python/requirements.txt

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
prometheus_client==0.20.0

src/resources/01-app-deployment.yml

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
---
2+
apiVersion: v1
3+
kind: Namespace
4+
metadata:
5+
name: application
6+
7+
---
8+
apiVersion: apps/v1
9+
kind: Deployment
10+
metadata:
11+
name: py-otel-server
12+
namespace: application
13+
labels:
14+
app: py-otel-server
15+
app.kubernetes.io/name: py-otel-server
16+
spec:
17+
replicas: 1
18+
selector:
19+
matchLabels:
20+
app: py-otel-server
21+
app.kubernetes.io/name: py-otel-server
22+
template:
23+
metadata:
24+
labels:
25+
app: py-otel-server
26+
app.kubernetes.io/name: py-otel-server
27+
spec:
28+
containers:
29+
- name: py-otel-server
30+
image: otel-python-lab:0.1.0-py-otel-server
31+
# image: docker.io/library/otel-python-lab:0.1.0-py-otel-server
32+
imagePullPolicy: Never
33+
ports:
34+
- containerPort: 8082
35+
name: py-server-port
36+
env:
37+
- name: OTEL_RESOURCE_ATTRIBUTES
38+
value: service.name=py-otel-server,service.version=0.1.0
39+
40+
---
41+
apiVersion: v1
42+
kind: Service
43+
metadata:
44+
name: py-otel-server-svc
45+
namespace: application
46+
labels:
47+
app: py-otel-server
48+
app.kubernetes.io/name: py-otel-server
49+
spec:
50+
selector:
51+
app.kubernetes.io/name: py-otel-server
52+
ports:
53+
- name: py-server-port
54+
protocol: TCP
55+
port: 8082
56+
targetPort: py-server-port

src/resources/01-blah.yml

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
---
2+
apiVersion: v1
3+
kind: Namespace
4+
metadata:
5+
name: opentelemetry
6+
7+
---
8+
apiVersion: apps/v1
9+
kind: Deployment
10+
metadata:
11+
name: my-app
12+
namespace: opentelemetry
13+
spec:
14+
replicas: 1
15+
selector:
16+
matchLabels:
17+
app: my-app
18+
template:
19+
metadata:
20+
labels:
21+
app: my-app
22+
spec:
23+
containers:
24+
- name: my-app
25+
image: otel-target-allocator-talk:0.1.0-py-ta-example
26+
imagePullPolicy: Always
27+
ports:
28+
- name: prom
29+
containerPort: 8080
30+
---
31+
apiVersion: v1
32+
kind: Service
33+
metadata:
34+
name: my-app
35+
namespace: opentelemetry
36+
labels:
37+
app: my-app
38+
spec:
39+
selector:
40+
app: my-app
41+
ports:
42+
- name: prom
43+
port: 8080

src/resources/02-rbac.yml

+78
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
apiVersion: v1
2+
kind: ServiceAccount
3+
metadata:
4+
name: otelcol
5+
namespace: opentelemetry
6+
---
7+
apiVersion: rbac.authorization.k8s.io/v1
8+
kind: ClusterRole
9+
metadata:
10+
name: opentelemetry-targetallocator-cr-role
11+
namespace: opentelemetry
12+
rules:
13+
- apiGroups:
14+
- monitoring.coreos.com
15+
resources:
16+
- servicemonitors
17+
- podmonitors
18+
verbs:
19+
- '*'
20+
---
21+
apiVersion: rbac.authorization.k8s.io/v1
22+
kind: ClusterRoleBinding
23+
metadata:
24+
name: otelcol-prom
25+
namespace: opentelemetry
26+
subjects:
27+
- kind: ServiceAccount
28+
name: otelcol
29+
namespace: default
30+
roleRef:
31+
kind: ClusterRole
32+
name: opentelemetry-targetallocator-cr-role
33+
apiGroup: rbac.authorization.k8s.io
34+
---
35+
apiVersion: rbac.authorization.k8s.io/v1
36+
kind: ClusterRole
37+
metadata:
38+
name: opentelemetry-targetallocator-role
39+
namespace: opentelemetry
40+
rules:
41+
- apiGroups: [""]
42+
resources:
43+
- nodes
44+
- nodes/metrics
45+
- services
46+
- endpoints
47+
- pods
48+
verbs: ["get", "list", "watch"]
49+
- apiGroups: [""]
50+
resources:
51+
- configmaps
52+
verbs: ["get"]
53+
- apiGroups:
54+
- discovery.k8s.io
55+
resources:
56+
- endpointslices
57+
verbs: ["get", "list", "watch"]
58+
- apiGroups:
59+
- networking.k8s.io
60+
resources:
61+
- ingresses
62+
verbs: ["get", "list", "watch"]
63+
- nonResourceURLs: ["/metrics"]
64+
verbs: ["get"]
65+
---
66+
apiVersion: rbac.authorization.k8s.io/v1
67+
kind: ClusterRoleBinding
68+
metadata:
69+
name: otelcol-discovery
70+
namespace: opentelemetry
71+
subjects:
72+
- kind: ServiceAccount
73+
name: otelcol
74+
namespace: default
75+
roleRef:
76+
kind: ClusterRole
77+
name: opentelemetry-targetallocator-role
78+
apiGroup: rbac.authorization.k8s.io

src/resources/03-otel-collector.yml

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
apiVersion: opentelemetry.io/v1alpha1
2+
kind: OpenTelemetryCollector
3+
metadata:
4+
name: otelcol
5+
namespace: opentelemetry
6+
spec:
7+
mode: statefulset
8+
targetAllocator:
9+
image: ghcr.io/open-telemetry/opentelemetry-operator/target-allocator:main
10+
enabled: true
11+
serviceAccount: otelcol
12+
prometheusCR:
13+
enabled: true
14+
serviceMonitorSelector:
15+
app: my-app
16+
config: |
17+
receivers:
18+
prometheus:
19+
config:
20+
scrape_configs:
21+
- job_name: 'otel-collector'
22+
scrape_interval: 30s
23+
static_configs:
24+
- targets: [ '0.0.0.0:8888' ]
25+
target_allocator:
26+
endpoint: http://otelcol-targetallocator
27+
interval: 30s
28+
collector_id: "${POD_NAME}"
29+
30+
exporters:
31+
logging:
32+
verbosity: detailed
33+
34+
service:
35+
pipelines:
36+
metrics:
37+
receivers: [prometheus]
38+
processors: []
39+
exporters: [logging]

src/resources/04-service-monitor.yml

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
apiVersion: monitoring.coreos.com/v1
2+
kind: ServiceMonitor
3+
metadata:
4+
name: my-app
5+
namespace: opentelemetry
6+
labels:
7+
app: my-app
8+
release: prometheus
9+
spec:
10+
selector:
11+
matchLabels:
12+
app: my-app
13+
endpoints:
14+
- port: prom
15+
path: /metrics

0 commit comments

Comments
 (0)