Skip to content
This repository was archived by the owner on Mar 27, 2023. It is now read-only.

Commit 7bc1d1c

Browse files
committed
Merge branch 'develop'
2 parents 11aa66d + 708de41 commit 7bc1d1c

File tree

7 files changed

+205
-41
lines changed

7 files changed

+205
-41
lines changed
Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,25 @@
1-
aws-cdk.core==1.41.0
2-
aws-cdk.aws_cloudformation==1.41.0
3-
aws-cdk.aws_certificatemanager==1.41.0
4-
aws-cdk.aws_logs==1.41.0
5-
aws-cdk.aws_secretsmanager==1.41.0
6-
aws-cdk.aws_route53==1.41.0
7-
aws-cdk.aws_s3==1.41.0
8-
aws_cdk.aws_s3_deployment==1.41.0
9-
aws-cdk.aws_cloudfront==1.41.0
10-
aws-cdk.aws_route53_targets==1.41.0
11-
aws-cdk.aws_ecr==1.41.0
12-
aws-cdk.aws_ec2==1.41.0
13-
aws-cdk.aws_rds==1.41.0
14-
aws-cdk.aws_ssm==1.41.0
15-
aws-cdk.aws_elasticache==1.41.0
16-
aws-cdk.aws_elasticloadbalancingv2==1.41.0
17-
aws-cdk.aws_ecs==1.41.0
18-
aws-cdk.aws_ecs_patterns==1.41.0
19-
aws-cdk.aws_autoscaling==1.41.0
20-
aws-cdk.aws_sqs==1.41.0
1+
aws-cdk.core==1.42.0
2+
aws-cdk.aws_cloudformation==1.42.0
3+
aws-cdk.aws_autoscaling==1.42.0
4+
aws-cdk.aws_applicationautoscaling==1.42.0
5+
aws-cdk.aws_certificatemanager==1.42.0
6+
aws-cdk.aws_cloudwatch==1.42.0
7+
aws-cdk.aws_logs==1.42.0
8+
aws-cdk.aws_events==1.42.0
9+
aws-cdk.aws_events_targets==1.42.0
10+
aws-cdk.aws_secretsmanager==1.42.0
11+
aws-cdk.aws_route53==1.42.0
12+
aws-cdk.aws_s3==1.42.0
13+
aws_cdk.aws_s3_deployment==1.42.0
14+
aws-cdk.aws_cloudfront==1.42.0
15+
aws-cdk.aws_route53_targets==1.42.0
16+
aws-cdk.aws_ecr==1.42.0
17+
aws-cdk.aws_ec2==1.42.0
18+
aws-cdk.aws_rds==1.42.0
19+
aws-cdk.aws_ssm==1.42.0
20+
aws-cdk.aws_elasticache==1.42.0
21+
aws-cdk.aws_elasticloadbalancingv2==1.42.0
22+
aws-cdk.aws_ecs==1.42.0
23+
aws-cdk.aws_ecs_patterns==1.42.0
24+
aws-cdk.aws_autoscaling==1.42.0
25+
aws-cdk.aws_sqs==1.42.0

awscdk/awscdk/cdk_app_root.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ def __init__(
7171
)
7272

7373
self.ecs = EcsStack(self, "EcsStack")
74+
self.cluster = self.ecs.cluster
7475

7576
self.rds = RdsStack(self, "RdsStack")
7677

awscdk/awscdk/celery_default.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,13 @@
22
core,
33
aws_ec2 as ec2,
44
aws_ecs as ecs,
5+
aws_events as events,
6+
aws_events_targets as events_targets,
7+
aws_ecs_patterns as ecs_patterns,
58
aws_logs as logs,
69
aws_cloudformation as cloudformation,
10+
aws_cloudwatch as cw,
11+
aws_applicationautoscaling as aas,
712
)
813

914

@@ -46,6 +51,7 @@ def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
4651
task_definition=self.celery_default_worker_task,
4752
assign_public_ip=True,
4853
cluster=scope.ecs.cluster,
54+
desired_count=0,
4955
security_group=ec2.SecurityGroup.from_security_group_id(
5056
self,
5157
"CeleryDefaultWorkerSG",
@@ -61,3 +67,61 @@ def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
6167
secret.grant_read(
6268
self.celery_default_worker_service.task_definition.task_role
6369
)
70+
71+
self.default_celery_queue_cw_metric = cw.Metric(
72+
namespace=scope.full_app_name, metric_name="default"
73+
)
74+
75+
self.celery_default_queue_asg = self.celery_default_worker_service.auto_scale_task_count(
76+
min_capacity=0, max_capacity=2
77+
)
78+
79+
self.celery_default_queue_asg.scale_on_metric(
80+
"CeleryDefaultQueueAutoscaling",
81+
metric=self.default_celery_queue_cw_metric,
82+
scaling_steps=[
83+
aas.ScalingInterval(change=-1, lower=0),
84+
aas.ScalingInterval(change=1, lower=1),
85+
],
86+
adjustment_type=aas.AdjustmentType.CHANGE_IN_CAPACITY,
87+
)
88+
89+
self.celery_default_cw_monitor_task = ecs.FargateTaskDefinition(
90+
self, "CeleryDefaultCWMonitoringTask"
91+
)
92+
93+
self.celery_default_cw_monitor_task.add_container(
94+
"CeleryDefaultCWMonitoringTaskContainer",
95+
image=scope.image,
96+
logging=ecs.LogDrivers.aws_logs(
97+
stream_prefix="CeleryDefaultCWMonitoringContainerLogs",
98+
log_retention=logs.RetentionDays.ONE_DAY,
99+
),
100+
environment=scope.variables.regular_variables,
101+
secrets=scope.variables.secret_variables,
102+
command=["python3", "manage.py", "put_celery_cloudwatch_metrics"],
103+
)
104+
105+
self.celery_default_cw_metric_schedule = events.Rule(
106+
self,
107+
"CeleryDefaultCWMetricSchedule",
108+
schedule=events.Schedule.rate(core.Duration.minutes(5)),
109+
targets=[
110+
events_targets.EcsTask(
111+
cluster=scope.cluster,
112+
task_definition=self.celery_default_cw_monitor_task,
113+
subnet_selection=ec2.SubnetSelection(
114+
subnet_type=ec2.SubnetType.PUBLIC
115+
),
116+
security_group=ec2.SecurityGroup.from_security_group_id(
117+
self,
118+
"CeleryDefaultCWMetricScheduleSG",
119+
security_group_id=scope.vpc.vpc_default_security_group,
120+
),
121+
)
122+
],
123+
)
124+
125+
self.default_celery_queue_cw_metric.grant_put_metric_data(
126+
self.celery_default_cw_monitor_task.task_role
127+
)

awscdk/awscdk/env_vars.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ def __init__(
3131
"DJANGO_SETTINGS_MODULE": "backend.settings.production",
3232
"DEBUG": "",
3333
"FULL_DOMAIN_NAME": full_domain_name,
34+
"FULL_APP_NAME": scope.full_app_name,
3435
"AWS_STORAGE_BUCKET_NAME": bucket_name,
3536
"POSTGRES_SERVICE_HOST": postgres_host,
3637
"POSTGRES_PASSWORD": db_secret.secret_value_from_json(

awscdk/setup.py

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,26 +15,31 @@
1515
package_dir={"": "awscdk"},
1616
packages=setuptools.find_packages(where="awscdk"),
1717
install_requires=[
18-
"aws-cdk.core==1.41.0",
19-
"aws-cdk.aws_cloudformation==1.41.0",
20-
"aws-cdk.aws_certificatemanager==1.41.0",
21-
"aws-cdk.aws_logs==1.41.0",
22-
"aws-cdk.aws_secretsmanager==1.41.0",
23-
"aws-cdk.aws_route53==1.41.0",
24-
"aws-cdk.aws_s3==1.41.0",
25-
"aws_cdk.aws_s3_deployment==1.41.0",
26-
"aws-cdk.aws_cloudfront==1.41.0",
27-
"aws-cdk.aws_route53_targets==1.41.0",
28-
"aws-cdk.aws_ecr==1.41.0",
29-
"aws-cdk.aws_ec2==1.41.0",
30-
"aws-cdk.aws_rds==1.41.0",
31-
"aws-cdk.aws_ssm==1.41.0",
32-
"aws-cdk.aws_elasticache==1.41.0",
33-
"aws-cdk.aws_elasticloadbalancingv2==1.41.0",
34-
"aws-cdk.aws_ecs==1.41.0",
35-
"aws-cdk.aws_ecs_patterns==1.41.0",
36-
"aws-cdk.aws_autoscaling==1.41.0",
37-
"aws-cdk.aws_sqs==1.41.0",
18+
"aws-cdk.core==1.42.0",
19+
"aws-cdk.aws_cloudformation==1.42.0",
20+
"aws-cdk.aws_autoscaling==1.42.0",
21+
"aws-cdk.aws_applicationautoscaling==1.42.0",
22+
"aws-cdk.aws_certificatemanager==1.42.0",
23+
"aws-cdk.aws_cloudwatch==1.42.0",
24+
"aws-cdk.aws_logs==1.42.0",
25+
"aws-cdk.aws_events==1.42.0",
26+
"aws-cdk.aws_events_targets==1.42.0",
27+
"aws-cdk.aws_secretsmanager==1.42.0",
28+
"aws-cdk.aws_route53==1.42.0",
29+
"aws-cdk.aws_s3==1.42.0",
30+
"aws_cdk.aws_s3_deployment==1.42.0",
31+
"aws-cdk.aws_cloudfront==1.42.0",
32+
"aws-cdk.aws_route53_targets==1.42.0",
33+
"aws-cdk.aws_ecr==1.42.0",
34+
"aws-cdk.aws_ec2==1.42.0",
35+
"aws-cdk.aws_rds==1.42.0",
36+
"aws-cdk.aws_ssm==1.42.0",
37+
"aws-cdk.aws_elasticache==1.42.0",
38+
"aws-cdk.aws_elasticloadbalancingv2==1.42.0",
39+
"aws-cdk.aws_ecs==1.42.0",
40+
"aws-cdk.aws_ecs_patterns==1.42.0",
41+
"aws-cdk.aws_autoscaling==1.42.0",
42+
"aws-cdk.aws_sqs==1.42.0",
3843
],
3944
python_requires=">=3.6",
4045
classifiers=[
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import os
2+
3+
import redis
4+
5+
from django.conf import settings
6+
from django.contrib.auth import get_user_model
7+
from django.core.management.base import BaseCommand
8+
9+
from apps.core import celery_app
10+
import boto3
11+
12+
13+
class Command(BaseCommand):
14+
help = "Creates a default superuser for local development"
15+
16+
def active_and_reserved_tasks_by_queue_name(self, queue_name):
17+
"""
18+
i.active() returns a dictionary where keys are worker names
19+
and values are lists of active tasks for the worker
20+
21+
"""
22+
print("inspecting celery queue")
23+
i = celery_app.control.inspect()
24+
25+
active = i.active()
26+
active_count = 0
27+
if active:
28+
for _, active_tasks in active.items():
29+
active_count += len(
30+
[
31+
task
32+
for task in active_tasks
33+
if task['delivery_info']['routing_key'] == queue_name
34+
]
35+
)
36+
37+
reserved = i.reserved()
38+
reserved_count = 0
39+
if reserved:
40+
for _, reserved_tasks in reserved.items():
41+
reserved_count += len(
42+
[
43+
task
44+
for task in reserved_tasks
45+
if task['delivery_info']['routing_key'] == queue_name
46+
]
47+
)
48+
49+
print("connecting to redis")
50+
r = redis.Redis(
51+
host=settings.REDIS_SERVICE_HOST,
52+
port=6379,
53+
db=1,
54+
charset="utf-8",
55+
decode_responses=True,
56+
)
57+
58+
queue_length = r.llen("default")
59+
total = active_count + reserved_count + queue_length
60+
print(f"Active count: {active_count}")
61+
print(f"Reserved count: {reserved_count}")
62+
print(f"Queue length: {queue_length}")
63+
print(f"Total: {total}")
64+
return total
65+
66+
def publish_queue_metrics(self, queue_names):
67+
print("gathering queue data")
68+
metric_data = {
69+
queue_name: self.active_and_reserved_tasks_by_queue_name(
70+
queue_name
71+
)
72+
for queue_name in queue_names
73+
}
74+
print("sending cloudwatch data")
75+
if not settings.DEBUG:
76+
print("connecting aws api")
77+
client = boto3.client('cloudwatch')
78+
client.put_metric_data(
79+
Namespace=os.environ.get("FULL_APP_NAME", "FULL_APP_NAME"),
80+
MetricData=[
81+
{"MetricName": metric_name, "Value": value}
82+
for metric_name, value in metric_data.items()
83+
],
84+
)
85+
86+
def handle(self, *args, **options):
87+
print("starting task")
88+
self.publish_queue_metrics(["default"])

gitlab-ci/aws/cdk.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
variables:
55
ENVIRONMENT: dev
66

7-
quasar build pwa:
7+
.quasar build pwa:
88
image: node:10
99
stage: build
1010
only:

0 commit comments

Comments
 (0)