Skip to content

Commit e2776b1

Browse files
committed
Adding App Insights Integration
1 parent 9d3f60b commit e2776b1

File tree

10 files changed

+74
-14
lines changed

10 files changed

+74
-14
lines changed

src/.gitignore

Lines changed: 0 additions & 1 deletion
This file was deleted.

src/Dockerfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ COPY requirements.txt .
66

77
RUN pip3 install -r requirements.txt
88

9-
COPY . /app
9+
COPY . .
1010

1111
EXPOSE 5000
12-
ENTRYPOINT [ "python3", "api/app.py" ]
12+
ENTRYPOINT ["gunicorn", "-c", "gunicorn.conf.py", "app:app"]

src/api/__init__.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import os
2+
3+
from flask import Flask
4+
from opencensus.ext.azure.trace_exporter import AzureExporter
5+
from opencensus.ext.flask.flask_middleware import FlaskMiddleware
6+
from opencensus.trace.samplers import ProbabilitySampler
7+
8+
app_insights_connection_string = os.getenv('APPLICATIONINSIGHTS_CONNECTION_STRING')
9+
10+
def create_app():
11+
flask = Flask(__name__)
12+
13+
from . import app
14+
flask.register_blueprint(app.bp, threaded=True)
15+
_ = FlaskMiddleware(\
16+
flask, \
17+
exporter=AzureExporter(\
18+
connection_string=app_insights_connection_string), \
19+
sampler=ProbabilitySampler(rate=1.0)
20+
)
21+
22+
return flask

src/api/app.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,25 @@
1-
from flask import Flask, jsonify
1+
import logging
2+
3+
from flask import jsonify, Blueprint
4+
from opencensus.trace import config_integration
5+
from opencensus.trace.samplers import AlwaysOnSampler
6+
from opencensus.trace.tracer import Tracer
27
import randomname
38

4-
app = Flask(__name__)
9+
bp = Blueprint("names", __name__)
10+
config_integration.trace_integrations(['logging'])
11+
logging.basicConfig(format='%(asctime)s traceId=%(traceId)s spanId=%(spanId)s %(message)s')
12+
tracer = Tracer(sampler=AlwaysOnSampler())
13+
logger = logging.getLogger(__name__)
14+
logger.setLevel(logging.DEBUG)
515

6-
@app.route('/')
16+
@bp.route("/")
717
def hello_world():
818
# Generate a random name including a first name and adjective
919
random_name = randomname.generate()
20+
with tracer.span(name=__name__):
21+
logger.info("Random Name Selected: - %s", random_name)
22+
1023
json = {"name": random_name}
11-
return jsonify(json)
1224

13-
if __name__ == '__main__':
14-
app.run(debug=True,host='0.0.0.0')
25+
return jsonify(json)

src/api/manifests/values.yaml.tmpl

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
nameOverride: ${SERVICE_NAME}-istio-svc
22
fullnameOverride: ${SERVICE_NAME}-istio-svc
3+
virtualServicePort: 5000
4+
35
replicas: 1
46

57
istio:
@@ -13,4 +15,17 @@ image:
1315
pullSecret: private-registry
1416

1517
service:
16-
port: 5000
18+
port: 5000
19+
20+
secretStore:
21+
enabled: true
22+
keyvaultName: ${AZURE_KEY_VAULT_NAME}
23+
tenantId: ${AZURE_TENANT_ID}
24+
useVMManagedIdentity: "true"
25+
usePodIdentity: "false"
26+
secrets:
27+
- envName: APPLICATIONINSIGHTS_CONNECTION_STRING
28+
objectName: appInsightsConnectionString
29+
alias: appsinsights
30+
identity:
31+
clientId: ${AZURE_AKS_KV_PROVIDER_CLIENT_ID}

src/app.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from api import create_app
2+
3+
app = create_app()

src/azure.yaml

Lines changed: 0 additions & 3 deletions
This file was deleted.

src/gunicorn.conf.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
bind = "[::]:5000"
2+
workers = 4
3+
threads = 4
4+
timeout = 120

src/hooks/preprovision.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ def set_azd_env_variable(name, value, export=False):
8181
)
8282

8383
target_cluster = prompt_user_for_target_clusters(clusters)
84+
kubelet_identity = target_cluster.addon_profiles["azureKeyvaultSecretsProvider"].identity
8485
resource_group_name = target_cluster.id.split("/")[4]
8586
bb_keyvault = client.get_keyvault(
8687
target_cluster.tags[AZD_ENVIRONMENT_NAME_RESOURCE_TAG], subscription_id, resource_group_name
@@ -95,6 +96,7 @@ def set_azd_env_variable(name, value, export=False):
9596
github_pat_token = client.get_keyvault_secret(bb_keyvault, "githubToken")
9697

9798
registry = client.get_container_registry(subscription_id, resource_group_name)
99+
tenant_id = bb_keyvault.properties.tenant_id
98100

99101
if registry is None:
100102
raise ValueError(
@@ -108,9 +110,11 @@ def set_azd_env_variable(name, value, export=False):
108110
set_azd_env_variable("AZURE_AKS_CLUSTER_NAME", target_cluster.name)
109111
set_azd_env_variable("AZURE_KEY_VAULT_ENDPOINT", bb_keyvault.properties.vault_uri)
110112
set_azd_env_variable("AZURE_KEY_VAULT_NAME", bb_keyvault.name)
113+
set_azd_env_variable("AZURE_AKS_KV_PROVIDER_CLIENT_ID", kubelet_identity.client_id)
111114
set_azd_env_variable("AZURE_RESOURCE_GROUP", resource_group_name)
112115
set_azd_env_variable("AZURE_AKS_ENVIRONMENT_NAME", \
113116
target_cluster.tags[AZD_ENVIRONMENT_NAME_RESOURCE_TAG], True)
117+
set_azd_env_variable("AZURE_TENANT_ID", tenant_id)
114118
set_azd_env_variable("AZURE_CONTAINER_REGISTRY_ENDPOINT", registry.login_server)
115119
set_azd_env_variable("GITOPS_REPO_RELEASE_BRANCH", \
116120
target_cluster.tags["gitops-release-branch"], True)

src/requirements.txt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
11
Flask==2.3.2
22
requests==2.21.0
3-
randomname
3+
randomname
4+
opencensus-ext-azure
5+
opencensus
6+
opencensus-ext-logging
7+
opencensus-ext-flask
8+
gunicorn==21.2.0

0 commit comments

Comments
 (0)