Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: Plug datadog apm #101

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
35 changes: 35 additions & 0 deletions apps/richie/templates/app/bc.yml.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{% if ddtrace is defined and ddtrace %}
apiVersion: v1
kind: BuildConfig
metadata:
labels:
app: richie
service: richie
version: "{{ richie_image_tag }}"
deployment_stamp: "{{ deployment_stamp }}"
name: "richie-{{ deployment_stamp }}"
namespace: "{{ project_name }}"
spec:
successfulBuildsHistoryLimit: 5
failedBuildsHistoryLimit: 2
triggers:
- type: ImageChange
- type: ConfigChange
strategy:
type: Docker
source:
dockerfile: |-
FROM {{ richie_image_name }}:{{ richie_image_tag }}
# Switch back to the root user to install development dependencies
USER root:root

RUN pip install --no-cache-dir --prefix=/usr/local ddtrace
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IMO the --prefix is not required: we do not need to split our dependencies in different places.

CMD ddtrace-run gunicorn -c /usr/local/etc/gunicorn/richie.py richie.wsgi:application

# Un-privileged user running the application
USER 10000
output:
to:
kind: ImageStreamTag
name: "ddtrace-richie-{{ deployment_stamp }}:{{ richie_image_tag }}"
{% endif %}
19 changes: 18 additions & 1 deletion apps/richie/templates/app/dc.yml.j2
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,13 @@ spec:
deployment_stamp: "{{ deployment_stamp }}"
spec:
containers:
- name: richie
- name: "richie"
{% if ddtrace is defined and ddtrace %}
image: "docker-registry.default.svc:5000/{{ project_name }}/ddtrace-richie-{{ deployment_stamp }}:{{ richie_image_tag }}"
#image: "ddtrace-richie-{{ deployment_stamp }}:{{ richie_image_tag }}"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do you need to force docker registry address? Because of minishift?

Anyway, only the commented line should stay right?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We discussed this with @rouja and propose to always point to an image stream.
Always having an image stream is an optimization we want because it stops downloading all the docker image layers on each deployment.

The syntax is more or less:

template:
    spec:
        containers:
        - name: "richie"
          image: ""
triggers:
    - type: ConfigChange
    - type: ImageChange
      imageChangeParams:
          automatic: true
          containerNames:
          - "richie"
          from:
            kind: ImageStreamTag
            name: "{{ richie_image_name }}:{{ richie_image_tag }}"

Then in the image stream, we build the image we need for each project:

  • adding monitoring (or not)
  • for edxapp: adding a theme (or not)
  • etc.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's a wonderful feature. I'll declare a new issue for this.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jmaupetit There is already a PR for this ;-) #105

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤔 yes, but it only scopes edxapp right?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

True! But it's a functional POC whereas my comment above was a bit vague.

{% else %}
image: "{{ richie_image_name }}:{{ richie_image_tag }}"
{% endif %}
imagePullPolicy: IfNotPresent
env:
- name: DJANGO_SETTINGS_MODULE
Expand All @@ -38,6 +43,18 @@ spec:
value: "{{ richie_host }}"
- name: ES_CLIENT
value: "richie-{{ richie_elasticsearch_host }}-{{ deployment_stamp }}"
{% if ddtrace is defined and ddtrace %}
- name: DATADOG_TRACE_AGENT_HOSTNAME
valueFrom:
fieldRef:
fieldPath: status.hostIP
- name: DD_AGENT_SERVICE_HOST
valueFrom:
fieldRef:
fieldPath: status.hostIP
- name: DD_AGENT_SERVICE_PORT
value: '8126'
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should it be configurable, e.g. stored in a var?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it should come from a variable?

{% endif %}
envFrom:
- secretRef:
name: richie-{{ secret_id }}
Expand Down
12 changes: 12 additions & 0 deletions apps/richie/templates/app/is.yml.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{% if ddtrace is defined and ddtrace %}
apiVersion: v1
kind: ImageStream
metadata:
labels:
app: richie
service: richie
version: "{{ richie_image_tag }}"
deployment_stamp: "{{ deployment_stamp }}"
name: "ddtrace-richie-{{ deployment_stamp }}"
namespace: "{{ project_name }}"
{% endif %}
6 changes: 6 additions & 0 deletions group_vars/all/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,12 @@ job_stamp: null
# docs/developer_guide/secrets.md
secret_id: "1.0.0"


# ddtrace is set to true for enable the APM in all apps where the templates
# include the possibility to have a ddtrace APM agent
# defaul is set to False
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would write:

# Set xxx to "true" to enable APM in all apps where defined templates
# include this feature (default: "false")

ddtrace: false
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we name it is_apm_enabled instead of ddtrace which is less explicit?


# TODO: move the following settings to the redirect app
# Ports
aliases_port: 8999
Expand Down
46 changes: 46 additions & 0 deletions group_vars/customer/patient0/staging/secrets/edxapp.vault.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
$ANSIBLE_VAULT;1.1;AES256
32383464343731303731643337633338333463636366306138343430336336383961353638326165
6639623661623435383237626634653036316361323535390a653966386136366461343961663561
63346637353036383837303964653438303564623739386334633763333866316637613138643435
6162393439326261360a613062346330313663633363643434636464633530303435613738666137
66336130663130393432343937663132623138636433313530313536383538323531333031346431
32386534363538303562316566356232626635393163656662613662313466366661316266333066
66353433336433363630393832633338656666366262353236646662366635626235396233353666
62623437376566393465303962363632326130613930363338303862653837643137653337643961
33633234616165336362323261623636313939393133646339626637363034623437356362326461
64313939643163616263613534356336383138326466336664653339336165333062363365333930
31356637643963373538313239343863343235383336636239306136373864333534366238616137
32373733626331613263356639626461656632623637636530366633646539366237356161393866
34633262626537636239313038313534663530393635383832643161656435373832306566653934
34313166363330373633396333613037333363346630663531333062313735626665353566653037
37303937323630613537316361373431373166613132356539633639393364343834326562356638
38623135376435376331323938653234303332643132303533313035373830616365306263643362
38363033373831323637643637653863306138646233316535666165643965346339333662306337
33656232656663646262366333653838633565623138356664313930386464306364663863653963
64393938363364653764656432373963363666636339613865636635633434313530376337386335
35356262376536646665393535353939643535316131626437666136336562666334326533353632
61346531623237666232366636376232613539323130633330313534313839366334646239613739
61633636373034323139323939303263633861646263646139343566396362303465396662336564
66616431613964383133346634363731356531383535313438653233366338363436383432343365
33393030653263373964386231303561316136326231396130386335326235316630366662356138
62303836343034373134373436346136323030376535383136663462616433366332613562343539
32363035393261636365353662616438323635353439326561653439613165373534393139393139
33383762386539336434636532613731643634383931383730646439346437656431363663373132
37363165623831656630393561386632633466623239613439303339376634656231336561386266
38313834626538613033626333323762316662306631656564346232326637613532663733343665
65386137326363623238613637383464303232303333663462346264656666353832626437373761
62333764323333343631373061653433646161653831346633326434386566353666363930616536
36396637363138306163393262306138366537313233313166343837353335663462613861356266
30616164313235313561383030313362656265353936646261363861613239663863663230663430
37616466643738653035333063396536333663366462326436386433306233643938386538313331
31336238653331396661623630343363626364326637373631643931313938393161303661303663
38656465313338313665653631326639306165616330633735313836363463623262653461376639
32306463323163326639313239336134636531666431663533666562646339616434386631646436
36666432373132306266343230396436363435643032666166623561663438623235653132333631
38336637393033663961663933396135386332383364356135353030323033336438656337383637
61633662346233333634366435323261363238633362346436666465386534316631353633626263
66386635393036326665373634303963383364653536393664316438663032303165376330336430
39356166323538653534663566623638653538633838643666633731653663313062393764313965
39333833336165303361643136656231323731623163353865366364623663313132396262326431
31306534633834636334633964646635333366383066616665666337643435376236313937396261
3435
24 changes: 24 additions & 0 deletions group_vars/customer/patient0/staging/secrets/richie.vault.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
$ANSIBLE_VAULT;1.1;AES256
33393739333530396262376134396462616166653566333130303762373863333235363033313930
3261656534636363646638383830653736643239633661300a376161653464343531396163316539
35623566616330616631383164653638663737656661363062653731373535316331646661303061
3430663036326335650a353638646430353365303666636466343964616634663861373061363163
63353361343336313435653931383036313463383035663638393630373431636130303232313265
66333439343838383331626463353364616165393163363565336564303861373932623233323830
36613632653833636236633963393237366461653366653037636339663631386661633737343966
38646437333838633335336666393437323664646662653432653565663861363638396266663035
63343531343136613834306434353061643362343166313163613432346234363963393163333336
66636635303033633363643530613961373931366136353037363130316633623264633633326166
38663837633239376234366138353664363836333631373639376164323838666133623737343032
32626537396136383165353832363035656132333932393364356232663937363939313738366331
64363661623562396235396232316531313935613161633439643537383165306234333334373330
35313736353835616465623735306231373165313234666166626337343038666661383139383963
30623030313666316638373832363139656463626534393930383838373962366562613136363164
63663238323134353235343337363266613333373438613634323533333837343539306161346332
31623763343363643466356231323532613537333532336533666364306631646331656262376230
38326339313237366162356239343332663432313063663038303431373037326137643962656364
33373163346633636135643137366163333137356464343631653436633637393633333032396630
65303530366238653064663932376136646132313633623834393735663536663438613630396663
38393962633165343837396532356433326366356237343632303764333532386632376163616131
61383531333431383265626566626166396435323834343831316431393766323466616634343436
643835306435653464303963306133636639
3 changes: 3 additions & 0 deletions group_vars/env_type/staging.yml
Original file line number Diff line number Diff line change
@@ -1,2 +1,5 @@
# Variables specific to the staging environment
richie_django_configuration: Staging

# Activate APM
ddtrace: true
2 changes: 2 additions & 0 deletions tasks/delete_app.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
register: raw_selected_objects
loop:
- ConfigMap
- BuildConfig
- ImageStream
- DeploymentConfig
- Job
- Route
Expand Down
18 changes: 18 additions & 0 deletions tasks/get_objects_for_app.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,16 @@
templates: "{{ app | json_query('services[*].templates[]') | list }}"
tags: deploy

- name: Set OpenShift datadog objects to manage
set_fact:
images: "{{ templates | map('regex_search', '.*/is.yml.j2$') | select('string') | list }}"
builds: "{{ templates | map('regex_search', '.*/bc.yml.j2$') | select('string') | list }}"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Those objects should be generic (imagestreams and buidconfigs), not only related to datadog APM. Hence you should move them in the next bloc.

when: ddtrace
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We always want to collect those objects not only when ddtrace is true. They are already conditionally created via their templates.

tags:
- deploy
- image
- build

- name: Set OpenShift objects to manage
set_fact:
deployments: "{{ templates | map('regex_search', '.*/dc.*\\.yml\\.j2$') | select('string') | list }}"
Expand All @@ -19,6 +29,14 @@
- job
- route

- name: Display OpenShift's build for this app
debug: msg="{{ builds | to_nice_yaml}}"
when: builds is defined
when: ddtrace
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove this condition.

tags:
- deploy
- build

- name: Display OpenShift's deployments for this app
debug:
msg: "{{ deployments | to_nice_yaml}}"
Expand Down
13 changes: 13 additions & 0 deletions tasks/manage_app.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,19 @@
# - "absent": all objects are deleted
# deployment_stamp: the stamp of the object we are going to create or delete

- name: OpenShift datadog objects with deployment_stamp[{{ deployment_stamp }}] must be {{ deployment_state | default('present') }}
openshift_raw:
definition: "{{ lookup('template', item) | from_yaml }}"
state: "{{ deployment_state | default('present') }}"
with_items:
- "{{ images }}"
- "{{ builds }}"
when: ddtrace
tags:
- deploy
- image
- build
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same idea here: you should create ISs and BCs as generic objects. This should not be datadog-specific.


- name: OpenShift objects with deployment_stamp[{{ deployment_stamp }}] must be {{ deployment_state | default('present') }}
openshift_raw:
definition: "{{ lookup('template', item) | from_yaml }}"
Expand Down