diff --git a/.github/workflows/build-and-push.yaml b/.github/workflows/build-and-push.yaml new file mode 100644 index 0000000..d8b4d8d --- /dev/null +++ b/.github/workflows/build-and-push.yaml @@ -0,0 +1,31 @@ +name: Build and push +on: + push: + branches: + - "main" + +jobs: + build-and-push: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2.3.4 + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v1 + with: + aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws-region: us-west-2 + - name: Login to Amazon ECR + id: login-ecr + uses: aws-actions/amazon-ecr-login@v1 + - name: Build, tag, and push image to Amazon ECR + env: + #ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} + ECR_REGISTRY: public.ecr.aws + ECR_REPOSITORY: z1r6e3l2/jfreeland/ec2-network-monitor + IMAGE_TAG: ${{ github.sha }} + run: | + docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG . + docker tag $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG $ECR_REGISTRY/$ECR_REPOSITORY:latest + docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG + docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cbb6bb9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +/bin +/.go +/.container-* +/.dockerfile-* diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..9023158 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,16 @@ +FROM golang:1.15-alpine AS builder + +WORKDIR $GOPATH/src/github.com/jfreeland/ec2-network-monitor + +# Download module dependencies to take advantage of Docker layer caching +COPY go.mod go.sum ./ +RUN go mod download + +COPY . . + +RUN mkdir output && \ + CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o output/ ./... + +FROM golang:1.15-alpine +COPY --from=builder /go/src/github.com/jfreeland/ec2-network-monitor/output/ec2nm /usr/local/bin +CMD ["ec2nm"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..a38e79b --- /dev/null +++ b/README.md @@ -0,0 +1,6 @@ +# ec2-network-monitor + +This is a simple example of monitoring ec2 network metrics that are not being +presented via ethtool. + +For more information see [Monitoring EC2 Network Performance ENA](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-network-performance-ena.html). diff --git a/cmd/ec2nm/main.go b/cmd/ec2nm/main.go new file mode 100644 index 0000000..c55f191 --- /dev/null +++ b/cmd/ec2nm/main.go @@ -0,0 +1,45 @@ +package main + +import ( + "flag" + "fmt" + "log" + "time" + + "github.com/DataDog/datadog-go/statsd" + "github.com/safchain/ethtool" +) + +func main() { + statsHost := flag.String("host", "", "the datadog agent host and port") + flag.Parse() + + statsd, err := statsd.New(*statsHost, statsd.WithNamespace("aws.ec2.")) + if err != nil { + log.Fatalf("err: %v\n", err) + } + + for { + ethHandle, err := ethtool.NewEthtool() + if err != nil { + log.Fatalf("err: %v\n", err) + } + defer ethHandle.Close() + + stats, err := ethHandle.Stats("eth0") + if err != nil { + log.Fatalf("err: %v\n", err) + } + + track := []string{"bw_in_allowance_exceeded", "bw_out_allowance_exceeded", "pps_allowance_exceeded", "conntrack_allowance_exceeded", "linklocal_allowance_exceeded"} + + for _, stat := range track { + fmt.Printf("%v: %v\n", stat, stats[stat]) + err = statsd.Count(stat, int64(stats[stat]), nil, 1) + if err != nil { + log.Printf("err posting gauge %v: %v\n", stat, err) + } + } + time.Sleep(10 * time.Second) + } +} diff --git a/ec2-network-monitor-0.1.0.tgz b/ec2-network-monitor-0.1.0.tgz new file mode 100644 index 0000000..b7615e1 Binary files /dev/null and b/ec2-network-monitor-0.1.0.tgz differ diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..03adcd0 --- /dev/null +++ b/go.mod @@ -0,0 +1,10 @@ +module github.com/thockin/go-build-template + +go 1.15 + +require ( + github.com/DataDog/datadog-go v4.2.0+incompatible + github.com/safchain/ethtool v0.0.0-20201023143004-874930cb3ce0 + github.com/stretchr/testify v1.6.1 // indirect + golang.org/x/sys v0.0.0-20201221093633-bc327ba9c2f0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..b82c6b6 --- /dev/null +++ b/go.sum @@ -0,0 +1,18 @@ +github.com/DataDog/datadog-go v4.2.0+incompatible h1:Q73jzyKHwyA04Gf4SSukRF+KR4wJEimU6tAuU0B8Y4Y= +github.com/DataDog/datadog-go v4.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/safchain/ethtool v0.0.0-20201023143004-874930cb3ce0 h1:eskphjc5kRCykOJyX7HHVbJCs25/8knprttvrVvEd8o= +github.com/safchain/ethtool v0.0.0-20201023143004-874930cb3ce0/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= +github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +golang.org/x/sys v0.0.0-20201221093633-bc327ba9c2f0 h1:n+DPcgTwkgWzIFpLmoimYR2K2b0Ga5+Os4kayIN0vGo= +golang.org/x/sys v0.0.0-20201221093633-bc327ba9c2f0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/helm/Chart.yaml b/helm/Chart.yaml new file mode 100644 index 0000000..f4ad39d --- /dev/null +++ b/helm/Chart.yaml @@ -0,0 +1,6 @@ +apiVersion: v2 +name: ec2-network-monitor +description: EC2 Network Performance Monitoring Stats Scraper +type: application +version: 0.1.0 +appVersion: 0.1.0 diff --git a/helm/templates/_helpers.tpl b/helm/templates/_helpers.tpl new file mode 100644 index 0000000..1f52f2c --- /dev/null +++ b/helm/templates/_helpers.tpl @@ -0,0 +1,63 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "ec2-network-monitor.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "ec2-network-monitor.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "ec2-network-monitor.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Common labels +*/}} +{{- define "ec2-network-monitor.labels" -}} +helm.sh/chart: {{ include "ec2-network-monitor.chart" . }} +{{ include "ec2-network-monitor.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end -}} + +{{/* +Selector labels +*/}} +{{- define "ec2-network-monitor.selectorLabels" -}} +app.kubernetes.io/name: {{ include "ec2-network-monitor.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end -}} + +{{/* +Create the name of the service account to use +*/}} +{{- define "ec2-network-monitor.serviceAccountName" -}} +{{- if .Values.serviceAccount.create -}} + {{ default (include "ec2-network-monitor.fullname" .) .Values.serviceAccount.name }} +{{- else -}} + {{ default "default" .Values.serviceAccount.name }} +{{- end -}} +{{- end -}} diff --git a/helm/templates/daemonset.yaml b/helm/templates/daemonset.yaml new file mode 100644 index 0000000..e7d9d34 --- /dev/null +++ b/helm/templates/daemonset.yaml @@ -0,0 +1,40 @@ +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: {{ include "ec2-network-monitor.fullname" . }} + labels: + {{- include "ec2-network-monitor.labels" . | nindent 4 }} +spec: + replicas: 1 + selector: + matchLabels: + {{- include "ec2-network-monitor.selectorLabels" . | nindent 6 }} + template: + metadata: + labels: + {{- include "ec2-network-monitor.selectorLabels" . | nindent 8 }} + spec: + containers: + - name: ec2-network-monitor + image: "public.ecr.aws/z1r6e3l2/jfreeland/ec2-network-monitor/ec2nm:latest" + env: + - name: DD_AGENT_HOST + valueFrom: + fieldRef: + fieldPath: status.hostIP + - name: DD_ENTITY_ID + valueFrom: + fieldRef: + fieldPath: metadata.uid + command: + - "/usr/local/bin/ec2nm" + args: + - "-host" + - $(DD_AGENT_HOST):8125 + imagePullPolicy: IfNotPresent + resources: + limits: + memory: 50Mi + requests: + cpu: 50M + memory: 50Mi diff --git a/helm/values.yaml b/helm/values.yaml new file mode 100644 index 0000000..e69de29 diff --git a/index.yaml b/index.yaml new file mode 100644 index 0000000..9a4e9fa --- /dev/null +++ b/index.yaml @@ -0,0 +1,14 @@ +apiVersion: v1 +entries: + ec2-network-monitor: + - apiVersion: v2 + appVersion: 0.1.0 + created: "2020-12-21T16:04:53.283473-08:00" + description: EC2 Network Performance Monitoring Stats Scraper + digest: 7588f3551d39b6909bd9c6d4d2cb7a13e06b18e4ba7462af56b0323842f13a0f + name: ec2-network-monitor + type: application + urls: + - https://jfreeland.github.io/ec2-network-monitor/ec2-network-monitor-0.1.0.tgz + version: 0.1.0 +generated: "2020-12-21T16:04:53.275455-08:00" diff --git a/robots.txt b/robots.txt new file mode 100644 index 0000000..954f34b --- /dev/null +++ b/robots.txt @@ -0,0 +1 @@ +“User-Agent: *nDisallow: /”