in elasticapm/contrib/django/management/commands/elasticapm.py [0:0]
def handle_check(self, command, **options):
"""Check your settings for common misconfigurations"""
passed = True
client = DjangoClient(metrics_interval="0ms")
if not client.config.enabled:
return True
def is_set(x):
return x and x != "None"
# check if org/app is set:
if is_set(client.config.service_name):
self.write("Service name is set, good job!", green)
else:
passed = False
self.write("Configuration errors detected!", red, ending="\n\n")
self.write(" * SERVICE_NAME not set! ", red, ending="\n")
self.write(CONFIG_EXAMPLE)
# secret token is optional but recommended
if not is_set(client.config.secret_token):
self.write(" * optional SECRET_TOKEN not set", yellow, ending="\n")
self.write("")
server_url = client.config.server_url
if server_url:
parsed_url = urllib.parse.urlparse(server_url)
if parsed_url.scheme.lower() in ("http", "https"):
# parse netloc, making sure people did not supply basic auth
if "@" in parsed_url.netloc:
credentials, _, path = parsed_url.netloc.rpartition("@")
passed = False
self.write("Configuration errors detected!", red, ending="\n\n")
if ":" in credentials:
self.write(" * SERVER_URL cannot contain authentication " "credentials", red, ending="\n")
else:
self.write(
" * SERVER_URL contains an unexpected at-sign!"
" This is usually used for basic authentication, "
"but the colon is left out",
red,
ending="\n",
)
else:
self.write("SERVER_URL {0} looks fine".format(server_url), green)
# secret token in the clear not recommended
if is_set(client.config.secret_token) and parsed_url.scheme.lower() == "http":
self.write(" * SECRET_TOKEN set but server not using https", yellow, ending="\n")
else:
self.write(
" * SERVER_URL has scheme {0} and we require " "http or https!".format(parsed_url.scheme),
red,
ending="\n",
)
passed = False
else:
self.write("Configuration errors detected!", red, ending="\n\n")
self.write(" * SERVER_URL appears to be empty", red, ending="\n")
passed = False
self.write("")
# check if we're disabled due to DEBUG:
if settings.DEBUG:
if getattr(settings, "ELASTIC_APM", {}).get("DEBUG"):
self.write(
"Note: even though you are running in DEBUG mode, we will "
'send data to the APM Server, because you set ELASTIC_APM["DEBUG"] to '
"True. You can disable ElasticAPM while in DEBUG mode like this"
"\n\n",
yellow,
)
self.write(
" ELASTIC_APM = {\n"
' "DEBUG": False,\n'
" # your other ELASTIC_APM settings\n"
" }"
)
else:
self.write(
"Looks like you're running in DEBUG mode. ElasticAPM will NOT "
"gather any data while DEBUG is set to True.\n\n",
red,
)
self.write(
"If you want to test ElasticAPM while DEBUG is set to True, you"
" can force ElasticAPM to gather data by setting"
' ELASTIC_APM["DEBUG"] to True, like this\n\n'
" ELASTIC_APM = {\n"
' "DEBUG": True,\n'
" # your other ELASTIC_APM settings\n"
" }"
)
passed = False
else:
self.write("DEBUG mode is disabled! Looking good!", green)
self.write("")
# check if middleware is set, and if it is at the first position
middleware_attr = "MIDDLEWARE" if getattr(settings, "MIDDLEWARE", None) is not None else "MIDDLEWARE_CLASSES"
middleware = list(getattr(settings, middleware_attr))
try:
pos = middleware.index("elasticapm.contrib.django.middleware.TracingMiddleware")
if pos == 0:
self.write("Tracing middleware is configured! Awesome!", green)
else:
self.write("Tracing middleware is configured, but not at the first position\n", yellow)
self.write("ElasticAPM works best if you add it at the top of your %s setting" % middleware_attr)
except ValueError:
self.write("Tracing middleware not configured!", red)
self.write(
"\n"
"Add it to your %(name)s setting like this:\n\n"
" %(name)s = (\n"
' "elasticapm.contrib.django.middleware.TracingMiddleware",\n'
" # your other middleware classes\n"
" )\n" % {"name": middleware_attr}
)
self.write("")
if passed:
self.write("Looks like everything should be ready!", green)
else:
self.write("Please fix the above errors.", red)
self.write("")
client.close()
return passed