-
Notifications
You must be signed in to change notification settings - Fork 0
/
linux-monitoring-cloudwatch.go
99 lines (79 loc) · 2.32 KB
/
linux-monitoring-cloudwatch.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package main
import (
"encoding/json"
"flag"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
"github.com/darnould/linux-monitoring-cloudwatch/Godeps/_workspace/src/github.com/awslabs/aws-sdk-go/aws"
"github.com/darnould/linux-monitoring-cloudwatch/Godeps/_workspace/src/github.com/awslabs/aws-sdk-go/service/cloudwatch"
"github.com/darnould/linux-monitoring-cloudwatch/Godeps/_workspace/src/github.com/guillermo/go.procmeminfo"
)
func main() {
ns := flag.String("namespace", "", "CloudWatch metric namespace (required)")
reg := flag.String("region", "", "AWS Region")
flag.Parse()
if *ns == "" {
fmt.Fprintln(os.Stderr, "Usage: ", os.Args[0])
flag.PrintDefaults()
os.Exit(1)
}
if *reg == "" {
r, err := region()
if err != nil {
log.Fatal("Can't find region: ", err)
}
reg = &r
}
mem, err := memoryUsage()
if err != nil {
log.Fatal("Can't get memory usage: ", err)
}
err = putMetric("MemoryUsage", "Percent", mem, *ns, *reg)
if err != nil {
log.Fatal("Can't put memory usage metric: ", err)
}
}
func putMetric(name, unit string, value float64, namespace, region string) error {
svc := cloudwatch.New(&aws.Config{Region: region})
metric_input := &cloudwatch.PutMetricDataInput{
MetricData: []*cloudwatch.MetricDatum{
&cloudwatch.MetricDatum{
MetricName: aws.String(name),
Unit: aws.String(unit),
Value: aws.Double(value),
},
},
Namespace: aws.String(namespace),
}
_, err := svc.PutMetricData(metric_input)
if awserr := aws.Error(err); awserr != nil {
return fmt.Errorf("[%s] %s", awserr.Code, awserr.Message)
} else if err != nil {
return err
}
return nil
}
func memoryUsage() (percentUsed float64, err error) {
meminfo := &procmeminfo.MemInfo{}
meminfo.Update()
percentUsed = (float64(meminfo.Used()) / float64(meminfo.Total())) * 100
log.Print("Memory usage: ", percentUsed)
return percentUsed, err
}
func region() (region string, err error) {
resp, err := http.Get("http://169.254.169.254/latest/dynamic/instance-identity/document")
if err != nil {
return "", fmt.Errorf("can't reach metadata endpoint - %s", err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return "", fmt.Errorf("can't read metadata response body - %s", err)
}
var data map[string]string
json.Unmarshal(body, &data)
return data["region"], err
}