master
SLW\ARNAUA 2023-03-01 13:42:07 +01:00
parent ca13d89d28
commit 6f2d54be25
9 changed files with 159 additions and 264 deletions

View File

@ -9,12 +9,11 @@ from nested_lookup import nested_lookup
from pathlib import Path
# defines
METRIC_KEYS = 4
SLOS_FOLDER_BASENAME = os.path.basename("slos")
OUTPUT_FOLDER_BASENAME = os.path.basename("output")
TEMPLATE_FOLDER_BASENAME = os.path.basename("templates")
TEMPLATE_FILES = {
"terraform-template.j2":["builtin:service.keyRequest.errors.fivexx.rate"],
"terraform-template.j2": ["builtin:service.keyRequest.errors.fivexx.rate"],
"terraform-template-2.j2":["builtin:service.keyRequest.errors.server.successCount",
"builtin:service.keyRequest.count.server"],
"terraform-template-3.j2":["builtin:service.keyRequest.errors.fivexx.count",
@ -31,28 +30,28 @@ FOLDERS = {"My Journey":"DE-3",
"China Services":"EC-DE"}
# methods
def homogenize_keyRequests(keyRequests):
for metric in metrics:
if len(metrics) < METRIC_KEYS:
metrics.append('')
return metrics
def homogenize_metrics(metricList):
for metric in metricList:
if len(metricList) < 4:
metricList.append('')
return metricList
def homogenize_services(services):
for metric in metrics:
if len(metrics) < METRIC_KEYS:
metrics.append('')
return metrics
def homogenize_services(serviceList):
for service in serviceList:
if len(serviceList) < 2:
serviceList.append('')
return serviceList
def homogenize_metrics(metrics):
for metric in metrics:
if len(metrics) < METRIC_KEYS:
metrics.append('')
return metrics
def homogenize_keyRequests(keyRequestLists):
for keyRequestList in keyRequestLists:
if len(keyRequestLists) < 2:
keyRequestLists.append('')
return keyRequestLists
def template_logic(metrics,TEMPLATE_FILES):
for template,metric in TEMPLATE_FILES.items():
if set(metrics) == set(metric):
def template_logic(metricList):
for template,metricTemplate in TEMPLATE_FILES.items():
if all([item in metricTemplate for item in metricList]):
# if set(metricList) == set(metricTemplate):
return template
print("Problem occured while matching metric: Exiting program...")
sys.exit(0)
@ -68,10 +67,11 @@ def main(configFile):
doc_url = None
slo_definition_tresholds_warning = None
slo_definition_tresholds_failure = None
metrics = {}
services = {}
keyRequests = {}
environments = {}
template = None
metricList = []
serviceList = []
keyRequestList = []
try:
# read yaml file
@ -101,43 +101,41 @@ def main(configFile):
if "CN-Prod" in slo["slo_definition"]:
environments["CN-Prod"] = slo["slo_definition"][env]
# for environment in environments:
# metrics[environment] = nested_lookup('metric',slo["slo_definition"][environment])
# for m,metric in enumerate(metrics):
# services[metric] = '~",\n\t\t\t\t~"'.join(nested_lookup('service',slo["slo_definition"][environment][m]["filter"]))
# keyRequests[environment] = nested_lookup('keyRequests',slo["slo_definition"][environment])
# keyRequests[environment] = '~",\n\t\t\t\t~"'.join(itertools.chain.from_iterable(keyRequests[environment]))
# read template file
jinja_environment = jinja2.Environment(loader=jinja2.FileSystemLoader(TEMPLATE_FOLDER_BASENAME),
trim_blocks=True,
lstrip_blocks=True)
# generate terraform file
for environment in environments:
for i,(environment,ev) in enumerate(environments.items()):
folder_path = os.path.join(cwd,OUTPUT_FOLDER_BASENAME,environment.replace('-','_'),"slo")
if not os.path.exists(folder_path):
os.makedirs(folder_path)
with open(os.path.join(folder_path,module_name+".tf"),"w+") as file:
t = template_logic(nested_lookup('metric',environments[environment]),TEMPLATE_FILES)
m = homogenize_metrics(nested_lookup('metric',environments[environment]))
s = homogenize_services(nested_lookup('service',environments[environment]))
k = homogenize_keyRequests(nested_lookup('keyRequests',environments[environment]))
jinja_template = jinja_environment.get_template(t)
file.write(jinja_template.render(module=module_name,
slo_name=slo_name,
metric=m[0],metricA=m[0],metricB=m[1],metricC=m[2],metricD=m[3],
description=description,
template = template_logic(nested_lookup('metric',ev))
metricList = homogenize_metrics(nested_lookup('metric',ev))
for service in ev[i]["filter"]:
serviceList.append(nested_lookup('service',service))
keyRequestList.append(nested_lookup('keyRequests',service))
i = 0
services=s[0],servicesA=s[0],servicesB=s[1],
keyRequests=k[0],keyRequestsA=k[0],keyRequestsB=k[1],
target=slo_definition_tresholds_failure,
warning=slo_definition_tresholds_warning))
with open(os.path.join(folder_path,module_name+".tf"),"w+") as file:
jinja_template = jinja_environment.get_template(template)
file.write(jinja_template.render(module=module_name,
slo_name=slo_name,
metric=metricList[0],
metricA=metricList[0],metricB=metricList[1],metricC=metricList[2],metricD=metricList[3],
description=description,
services='~",\n\t\t\t\t~"'.join(serviceList[0]),
servicesA='~",\n\t\t\t\t~"'.join(serviceList[0]),servicesB='~",\n\t\t\t\t~"'.join(serviceList[1]),
keyRequests='~",\n\t\t\t\t~"'.join(itertools.chain.from_iterable(keyRequestList[0])),
keyRequestsA='~",\n\t\t\t\t~"'.join(itertools.chain.from_iterable(keyRequestList[0])),
keyRequestsB='~",\n\t\t\t\t~"'.join(itertools.chain.from_iterable(keyRequestList[1])),
target=slo_definition_tresholds_failure,
warning=slo_definition_tresholds_warning))
if __name__ == "__main__":
# pre-initialization get current working directory

View File

@ -1,51 +0,0 @@
module TP_Mobile_Send2VehicleMGU {
source = "../../_dynatrace-base-modules/dynatrace-service-level-objective"
name = "TP_Mobile_Send2VehicleMGU"
description = "2.0 SLO Mobile"
# entity selector object
filter = ""
# metric expression of the calculation as done in data explorer ui
metric_expression = <<EOT
(100)*((builtin:service.keyRequest.errors.server.successCount:filter(and(or(in("dt.entity.service_method",entitySelector("type(service_method),
fromRelationship.isServiceMethodOfService(
type(~"SERVICE~"),entityName.in(
~"TripService - PROD~",
~"TripService - PROD~"
)
),entityName.in(
~"/v3/motorist/[UUID]/trips~",
~"/v2/motorist/[UUID]/trips~",
~"/v3/motorist/[UUID]/trips~",
~"/v2/motorist/[UUID]/trips~"
)"))))):splitBy())
/
(builtin:service.keyRequest.count.server:filter(and(or(in("dt.entity.service_method",entitySelector("type(service_method),
fromRelationship.isServiceMethodOfService(
type(~"SERVICE~"),entityName.in(
~"TripService - PROD~",
~"TripService - PROD~"
)
),entityName.in(
~"/v3/motorist/[UUID]/trips~",
~"/v2/motorist/[UUID]/trips~",
~"/v3/motorist/[UUID]/trips~",
~"/v2/motorist/[UUID]/trips~"
)"))))):splitBy()))
EOT
# if not set (removed) it's defaulted to "-1d"
timeframe = "-1d"
# currently the only possible value
evaluation = "AGGREGATE"
# target and warning percentage of the SLO as double
target = 98 # if not set(removed) it's defaulted to 98
warning = 99 # if not set(removed) it's defaulted to 99
}

View File

@ -0,0 +1,109 @@
module TP_Mobile_Send2VehicleMGU {
source = "../../_dynatrace-base-modules/dynatrace-service-level-objective"
name = "TP_Mobile_Send2VehicleMGU"
description = "2.0 SLO Mobile"
# entity selector object
filter = ""
# metric expression of the calculation as done in data explorer ui
metric_expression = <<EOT
(100)*((builtin:service.keyRequest.errors.server.successCount:filter(and(or(in("dt.entity.service_method",entitySelector("type(service_method),
fromRelationship.isServiceMethodOfService(
type(~"SERVICE~"),entityName.in(
~"T~",
~"r~",
~"i~",
~"p~",
~"S~",
~"e~",
~"r~",
~"v~",
~"i~",
~"c~",
~"e~",
~" ~",
~"-~",
~" ~",
~"P~",
~"R~",
~"O~",
~"D~"
)
),entityName.in(
~"/~",
~"v~",
~"3~",
~"/~",
~"m~",
~"o~",
~"t~",
~"o~",
~"r~",
~"i~",
~"s~",
~"t~",
~"/~",
~"[~",
~"U~",
~"U~",
~"I~",
~"D~",
~"]~",
~"/~",
~"t~",
~"r~",
~"i~",
~"p~",
~"s~",
~"/~",
~"v~",
~"2~",
~"/~",
~"m~",
~"o~",
~"t~",
~"o~",
~"r~",
~"i~",
~"s~",
~"t~",
~"/~",
~"[~",
~"U~",
~"U~",
~"I~",
~"D~",
~"]~",
~"/~",
~"t~",
~"r~",
~"i~",
~"p~",
~"s~"
)"))))):splitBy())
/
(builtin:service.keyRequest.count.server:filter(and(or(in("dt.entity.service_method",entitySelector("type(service_method),
fromRelationship.isServiceMethodOfService(
type(~"SERVICE~"),entityName.in(
~"~"
)
),entityName.in(
~"~"
)"))))):splitBy()))
EOT
# if not set (removed) it's defaulted to "-1d"
timeframe = "-1d"
# currently the only possible value
evaluation = "AGGREGATE"
# target and warning percentage of the SLO as double
target = 98 # if not set(removed) it's defaulted to 98
warning = 99 # if not set(removed) it's defaulted to 99
}

View File

@ -1,36 +0,0 @@
module TP_Vehicle_FTS {
source = "../../_dynatrace-base-modules/dynatrace-service-level-objective"
name = "TP_Vehicle_FTS"
description = "CoCo-QM-Report_Draft"
# entity selector object
filter = ""
# metric expression of the calculation as done in data explorer ui
metric_expression = <<EOT
(100)-(builtin:service.keyRequest.errors.fivexx.rate:filter(and(or(in("dt.entity.service_method",entitySelector("type(service_method),
fromRelationship.isServiceMethodOfService(
type(~"SERVICE~"),entityName.in(
~"SimplePOIs~",
~"POIs~"
)
),entityName.in(
~"getSimplePOIs (FTS Calls)~",
~"getPOIs (FTS Calls)~"
)"))))):splitBy())
EOT
# if not set (removed) it's defaulted to "-1d"
timeframe = "-1d"
# currently the only possible value
evaluation = "AGGREGATE"
# target and warning percentage of the SLO as double
target = 98 # if not set(removed) it's defaulted to 98
warning = 99 # if not set(removed) it's defaulted to 99
}

View File

@ -1,37 +0,0 @@
module TP_Vehicle_eRoute {
source = "../../_dynatrace-base-modules/dynatrace-service-level-objective"
name = "TP_Vehicle_eRoute"
description = "CoCo QM-Report_Vehicle"
# entity selector object
filter = ""
# metric expression of the calculation as done in data explorer ui
metric_expression = <<EOT
(100)-(builtin:service.keyRequest.errors.fivexx.rate:filter(and(or(in("dt.entity.service_method",entitySelector("type(service_method),
fromRelationship.isServiceMethodOfService(
type(~"SERVICE~"),entityName.in(
~"Netty on 0.0.0.0:8080 - eroute-ext - prod~",
~"Netty on 0.0.0.0:8080 - eroute-adapter - prod~"
)
),entityName.in(
~"/api/eu/2.5/eroute/protobuf3~",
~"/api/eu/2.5/eroute-costs/protobuf3~",
~"/route/eroute~"
)"))))):splitBy())
EOT
# if not set (removed) it's defaulted to "-1d"
timeframe = "-1d"
# currently the only possible value
evaluation = "AGGREGATE"
# target and warning percentage of the SLO as double
target = 98 # if not set(removed) it's defaulted to 98
warning = 99 # if not set(removed) it's defaulted to 99
}

View File

@ -1,51 +0,0 @@
module TP_Mobile_Send2VehicleMGU {
source = "../../_dynatrace-base-modules/dynatrace-service-level-objective"
name = "TP_Mobile_Send2VehicleMGU"
description = "2.0 SLO Mobile"
# entity selector object
filter = ""
# metric expression of the calculation as done in data explorer ui
metric_expression = <<EOT
(100)*((builtin:service.keyRequest.errors.server.successCount:filter(and(or(in("dt.entity.service_method",entitySelector("type(service_method),
fromRelationship.isServiceMethodOfService(
type(~"SERVICE~"),entityName.in(
~"TripService - PROD~",
~"TripService - PROD~"
)
),entityName.in(
~"/v2/motorist/[UUID]/trips~",
~"/v3/motorist/[UUID]/trips~",
~"/v2/motorist/[UUID]/trips~",
~"/v3/motorist/[UUID]/trips~"
)"))))):splitBy())
/
(builtin:service.keyRequest.count.server:filter(and(or(in("dt.entity.service_method",entitySelector("type(service_method),
fromRelationship.isServiceMethodOfService(
type(~"SERVICE~"),entityName.in(
~"TripService - PROD~",
~"TripService - PROD~"
)
),entityName.in(
~"/v2/motorist/[UUID]/trips~",
~"/v3/motorist/[UUID]/trips~",
~"/v2/motorist/[UUID]/trips~",
~"/v3/motorist/[UUID]/trips~"
)"))))):splitBy()))
EOT
# if not set (removed) it's defaulted to "-1d"
timeframe = "-1d"
# currently the only possible value
evaluation = "AGGREGATE"
# target and warning percentage of the SLO as double
target = 98 # if not set(removed) it's defaulted to 98
warning = 99 # if not set(removed) it's defaulted to 99
}

View File

@ -1,37 +0,0 @@
module TP_Vehicle_eRoute {
source = "../../_dynatrace-base-modules/dynatrace-service-level-objective"
name = "TP_Vehicle_eRoute"
description = "CoCo QM-Report_Vehicle"
# entity selector object
filter = ""
# metric expression of the calculation as done in data explorer ui
metric_expression = <<EOT
(100)-(builtin:service.keyRequest.errors.fivexx.rate:filter(and(or(in("dt.entity.service_method",entitySelector("type(service_method),
fromRelationship.isServiceMethodOfService(
type(~"SERVICE~"),entityName.in(
~"Netty on 0.0.0.0:8080 - eroute-ext - prod~",
~"Netty on 0.0.0.0:8080 - eroute-adapter - prod~"
)
),entityName.in(
~"/api/eu/2.5/eroute/protobuf3~",
~"/api/eu/2.5/eroute-costs/protobuf3~",
~"/route/eroute~"
)"))))):splitBy())
EOT
# if not set (removed) it's defaulted to "-1d"
timeframe = "-1d"
# currently the only possible value
evaluation = "AGGREGATE"
# target and warning percentage of the SLO as double
target = 98 # if not set(removed) it's defaulted to 98
warning = 99 # if not set(removed) it's defaulted to 99
}

View File

@ -23,10 +23,10 @@ module {{ module }} {
({{ metricB }}:filter(and(or(in("dt.entity.service_method",entitySelector("type(service_method),
fromRelationship.isServiceMethodOfService(
type(~"SERVICE~"),entityName.in(
~"{{ servicesA }}~"
~"{{ servicesB }}~"
)
),entityName.in(
~"{{ keyRequestsA }}~"
~"{{ keyRequestsB }}~"
)"))))):splitBy()))
EOT