-
Notifications
You must be signed in to change notification settings - Fork 11
/
cloudwatch-xray-apm-demo-cfn.yaml
178 lines (176 loc) · 6.59 KB
/
cloudwatch-xray-apm-demo-cfn.yaml
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
Parameters:
KeyPair:
Type: "AWS::EC2::KeyPair::KeyName"
Description: Name of existing KeyPair for ssh access to EC2 instance
Mappings:
RegionMap:
us-east-2:
"64": ami-15e9c770
us-east-1:
"64": ami-55ef662f
us-west-1:
"64": ami-a51f27c5
us-west-2:
"64": ami-bf4193c7
ca-central-1:
"64": ami-d29e25b6
ap-south-1:
"64": ami-d5c18eba
ap-northeast-2:
"64": ami-1196317f
ap-southeast-1:
"64": ami-c63d6aa5
ap-southeast-2:
"64": ami-ff4ea59d
ap-northeast-1:
"64": ami-da9e2cbc
eu-central-1:
"64": ami-bf2ba8d0
eu-west-1:
"64": ami-1a962263
eu-west-2:
"64": ami-e7d6c983
sa-east-1:
"64": ami-286f2a44
Resources:
APMLogGroup:
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: "aws-apm-demo/my_app"
RetentionInDays: 7
FactorialLatency:
Type: "AWS::Logs::MetricFilter"
Properties:
FilterPattern: '[recorded_at, severity, flag="my_app.metrics", k1, v1, k2, v2]'
LogGroupName:
Ref: "APMLogGroup"
MetricTransformations:
- MetricName: log.latency.factorial-average
MetricNamespace: collectd
MetricValue: $v1
FibonacciLatency:
Type: "AWS::Logs::MetricFilter"
Properties:
FilterPattern: '[recorded_at, severity, flag="my_app.metrics", k1, v1, k2, v2]'
LogGroupName:
Ref: "APMLogGroup"
MetricTransformations:
- MetricName: log.latency.fibonacci-average
MetricNamespace: collectd
MetricValue: $v2
MyAPMDashboard:
Type: "AWS::CloudWatch::Dashboard"
Properties:
# global unique name
DashboardName: !Sub '${AWS::StackName}-${AWS::Region}'
DashboardBody: !Sub
- '{"widgets":[{"type":"metric","x":0,"y":0,"width":6,"height":6,"properties":{"view":"timeSeries","stacked":true,"metrics":[["collectd","statsd.latency.factorial-average","PluginInstance","NONE","Host","${EC2_INSTANCE_ID}",{"period":1}]],"region":"${AWS::Region}","title":"udp.factorial(s)","period":300}},{"type":"metric","x":0,"y":6,"width":6,"height":6,"properties":{"view":"timeSeries","stacked":true,"metrics":[["collectd","statsd.latency.fibonacci-average","PluginInstance","NONE","Host", "${EC2_INSTANCE_ID}",{"period":1}]],"region":"${AWS::Region}","title":"udp.fibonacci(s)","period":300}},{"type":"metric","x":6,"y":0,"width":6,"height":6,"properties":{"view":"timeSeries","stacked":true,"metrics":[["collectd","log.latency.factorial-average",{"period":1}]],"region":"${AWS::Region}","period":300,"title":"log.factorial(s)"}},{"type":"metric","x":6,"y":6,"width":6,"height":6,"properties":{"view":"timeSeries","stacked":true,"metrics":[["collectd","log.latency.fibonacci-average",{"period":1}]],"region":"${AWS::Region}","period":300,"title":"log.fibonacci(s)"}}]}'
- {EC2_INSTANCE_ID: !Ref MyInstance}
SSHSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Enable SSH access via port 22
SecurityGroupIngress:
- CidrIp: 0.0.0.0/0
FromPort: 22
IpProtocol: tcp
ToPort: 22
EC2Role:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service:
- ec2.amazonaws.com
Action:
- sts:AssumeRole
Path: "/"
RolePolicies:
Type: AWS::IAM::Policy
Properties:
PolicyName: CloudWatchPut_Logs_Xray
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- cloudwatch:PutDashboard
- cloudwatch:PutMetricData
- logs:CreateLogGroup
- logs:CreateLogStream
- logs:PutLogEvents
- logs:putMetricFilter
- logs:DescribeLogStreams
- xray:PutTraceSegments
- xray:PutTelemetryRecords
Resource: "*"
Roles:
- !Ref EC2Role
EC2InstanceProfile:
Type: AWS::IAM::InstanceProfile
Properties:
Path: "/"
Roles:
- !Ref EC2Role
MyInstance:
Type: AWS::EC2::Instance
Properties:
KeyName: !Ref KeyPair
IamInstanceProfile: !Ref EC2InstanceProfile
SecurityGroups:
- !Ref SSHSecurityGroup
UserData:
Fn::Base64: !Sub |
#!/bin/bash -xe
yum update -y
yum install -y git
yum install -y gcc
yum install -y ruby-devel
su - ec2-user -c 'gem install bundler'
su - ec2-user -c 'cd ~ && git clone https://github.com/awslabs/cloudwatch-xray-apm-demo.git aws-apm && cd aws-apm && git checkout initial-version && mkdir logs && bundle install'
# CloudWatch Logs Agent
cd ~
yum install -y awslogs
service awslogs stop
cp /etc/awslogs/awslogs.conf /etc/awslogs/awslogs.conf.bkp
cp /home/ec2-user/aws-apm/config/cw_logs/cw_logs.conf /etc/awslogs/awslogs.conf
sed -i 's/region\s*=\s*.*/region=${AWS::Region}/g' /etc/awslogs/awscli.conf
service awslogs start
chkconfig awslogs on
# collectd
yum -y install collectd-python
yum -y install collectd
wget https://raw.githubusercontent.com/awslabs/collectd-cloudwatch/master/src/setup.py
chmod u+x setup.py
./setup.py -m not_modify -I
service collectd stop
cp -f /etc/collectd.conf /etc/collectd.conf.bkp
cp -f /home/ec2-user/aws-apm/config/collectd/collectd.conf /etc/collectd.conf
cp -f /home/ec2-user/aws-apm/config/collectd/cw_plugin/collectd-cloudwatch.conf /etc/collectd-cloudwatch.conf
cp -f /home/ec2-user/aws-apm/config/collectd/cw_plugin/cw_plugin.conf /opt/collectd-plugins/cloudwatch/config/plugin.conf
cp /home/ec2-user/aws-apm/config/collectd/cw_plugin/whitelist.conf /opt/collectd-plugins/cloudwatch/config/whitelist.conf
service collectd start
chkconfig collectd on
# X-Ray
curl https://s3.dualstack.us-east-2.amazonaws.com/aws-xray-assets.us-east-2/xray-daemon/aws-xray-daemon-2.x.rpm -o xray.rpm
sudo yum install -y xray.rpm
# Start background process
su - ec2-user -c 'cd ~/aws-apm; nohup bundle exec samples/apps/my_app.rb &'
InstanceType: t2.micro
AvailabilityZone:
Fn::Select:
- 0
- Fn::GetAZs: !Ref "AWS::Region"
ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", 64]
Tags:
-
Key: Name
Value: !Sub '${AWS::StackName}'
Outputs:
MyInstance:
Value: !Ref MyInstance
MyInstanceDNS:
Value: !GetAtt MyInstance.PublicDnsName