|
1 | 1 | #!/usr/bin/env python3 |
2 | 2 | import atexit |
3 | 3 | import base64 |
| 4 | +import codecs |
4 | 5 | import datetime |
| 6 | +import itertools |
5 | 7 | import json |
6 | 8 | import logging |
7 | 9 | import os |
8 | 10 | import re |
9 | 11 | import signal |
10 | 12 | import subprocess |
11 | 13 | import sys |
| 14 | +import threading |
12 | 15 | import time |
13 | 16 | import traceback |
14 | 17 | import uuid |
|
24 | 27 | from nginx import get_path_config, gen_htpasswd # noqa: E402 |
25 | 28 | from buildpackutil import i_am_primary_instance # noqa: E402 |
26 | 29 |
|
| 30 | +HEARTBEAT_SOURCE_STRING = """Gur Mra bs Clguba, ol Gvz Crgref |
| 31 | +Ornhgvshy vf orggre guna htyl. |
| 32 | +Rkcyvpvg vf orggre guna vzcyvpvg. |
| 33 | +Fvzcyr vf orggre guna pbzcyrk. |
| 34 | +Pbzcyrk vf orggre guna pbzcyvpngrq. |
| 35 | +Syng vf orggre guna arfgrq. |
| 36 | +Fcnefr vf orggre guna qrafr. |
| 37 | +Ernqnovyvgl pbhagf. |
| 38 | +Fcrpvny pnfrf nera'g fcrpvny rabhtu gb oernx gur ehyrf. |
| 39 | +Nygubhtu cenpgvpnyvgl orngf chevgl. |
| 40 | +Reebef fubhyq arire cnff fvyragyl. |
| 41 | +Hayrff rkcyvpvgyl fvyraprq. |
| 42 | +Va gur snpr bs nzovthvgl, ershfr gur grzcgngvba gb thrff. |
| 43 | +Gurer fubhyq or bar-- naq cersrenoyl bayl bar --boivbhf jnl gb qb vg. |
| 44 | +Nygubhtu gung jnl znl abg or boivbhf ng svefg hayrff lbh'er Qhgpu. |
| 45 | +Abj vf orggre guna arire. |
| 46 | +Nygubhtu arire vf bsgra orggre guna *evtug* abj. |
| 47 | +Vs gur vzcyrzragngvba vf uneq gb rkcynva, vg'f n onq vqrn. |
| 48 | +Vs gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n tbbq vqrn. |
| 49 | +Anzrfcnprf ner bar ubaxvat terng vqrn -- yrg'f qb zber bs gubfr!""" |
| 50 | +HEARTBEAT_STRING_LIST = codecs.encode(HEARTBEAT_SOURCE_STRING, "rot13").split( |
| 51 | + "\n" |
| 52 | +) |
| 53 | + |
27 | 54 | logger.setLevel(buildpackutil.get_buildpack_loglevel()) |
28 | | -logger.info("Started Mendix Cloud Foundry Buildpack v2.1.3") |
| 55 | +logger.info("Started Mendix Cloud Foundry Buildpack v2.2.1") |
29 | 56 | logging.getLogger("m2ee").propagate = False |
30 | 57 |
|
31 | 58 |
|
@@ -228,6 +255,14 @@ def get_constants(metadata): |
228 | 255 | return constants |
229 | 256 |
|
230 | 257 |
|
| 258 | +def set_jvm_locale(m2ee_section, java_version): |
| 259 | + javaopts = m2ee_section["javaopts"] |
| 260 | + |
| 261 | + # enable locale for java8 or later |
| 262 | + if not java_version.startswith("7"): |
| 263 | + javaopts.append("-Djava.locale.providers=JRE,SPI,CLDR") |
| 264 | + |
| 265 | + |
231 | 266 | def set_jvm_memory(m2ee_section, vcap, java_version): |
232 | 267 | max_memory = os.environ.get("MEMORY_LIMIT") |
233 | 268 |
|
@@ -720,6 +755,7 @@ def set_up_m2ee_client(vcap_data): |
720 | 755 | m2ee.config.get_runtime_version() |
721 | 756 | ) |
722 | 757 | set_jvm_memory(m2ee.config._conf["m2ee"], vcap_data, java_version) |
| 758 | + set_jvm_locale(m2ee.config._conf["m2ee"], java_version) |
723 | 759 | set_jetty_config(m2ee) |
724 | 760 | activate_new_relic(m2ee, vcap_data["application_name"]) |
725 | 761 | activate_appdynamics(m2ee, vcap_data["application_name"]) |
@@ -818,7 +854,7 @@ def service_backups(): |
818 | 854 | logger.warning("Failed to contact backup service. SSLError: " + str(e)) |
819 | 855 | return |
820 | 856 | except Exception as e: |
821 | | - logger.warning("Failed to contact backup service: " + e) |
| 857 | + logger.warning("Failed to contact backup service: ", exc_info=True) |
822 | 858 | return |
823 | 859 |
|
824 | 860 | if result.status_code == 200: |
@@ -1041,6 +1077,29 @@ def start_metrics(m2ee): |
1041 | 1077 | thread.start() |
1042 | 1078 |
|
1043 | 1079 |
|
| 1080 | +class LoggingHeartbeatEmitterThread(threading.Thread): |
| 1081 | + def __init__(self, interval): |
| 1082 | + super().__init__() |
| 1083 | + self.interval = interval |
| 1084 | + |
| 1085 | + def run(self): |
| 1086 | + logger.debug( |
| 1087 | + "Starting metrics emitter with interval %d", self.interval |
| 1088 | + ) |
| 1089 | + for line in itertools.cycle(HEARTBEAT_STRING_LIST): |
| 1090 | + logger.info("MENDIX-LOGGING-HEARTBEAT: %s", line) |
| 1091 | + time.sleep(self.interval) |
| 1092 | + |
| 1093 | + |
| 1094 | +def start_logging_heartbeat(): |
| 1095 | + logging_interval = os.getenv( |
| 1096 | + "METRICS_LOGGING_HEARTBEAT_INTERVAL", str(3600 * 6) |
| 1097 | + ) |
| 1098 | + thread = LoggingHeartbeatEmitterThread(int(logging_interval)) |
| 1099 | + thread.setDaemon(True) |
| 1100 | + thread.start() |
| 1101 | + |
| 1102 | + |
1044 | 1103 | def complete_start_procedure_safe_to_use_for_restart(m2ee): |
1045 | 1104 | buildpackutil.mkdir_p("model/lib/userlib") |
1046 | 1105 | set_up_logging_file() |
@@ -1089,6 +1148,7 @@ def sigusr_handler(_signo, _stack_frame): |
1089 | 1148 | complete_start_procedure_safe_to_use_for_restart(m2ee) |
1090 | 1149 | set_up_instadeploy_if_deploy_password_is_set(m2ee) |
1091 | 1150 | start_metrics(m2ee) |
| 1151 | + start_logging_heartbeat() |
1092 | 1152 | start_nginx() |
1093 | 1153 | loop_until_process_dies(m2ee) |
1094 | 1154 | except Exception: |
|
0 commit comments