From 16f2411696d5128391fb5dc41fe3aece6b38c13f Mon Sep 17 00:00:00 2001 From: Martin Linkhorst Date: Wed, 28 Feb 2018 14:59:05 +0100 Subject: [PATCH 1/5] feat: serve metrics under a dedicated port --- etcd.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/etcd.py b/etcd.py index 9e6e8f0..df77afa 100755 --- a/etcd.py +++ b/etcd.py @@ -37,6 +37,7 @@ class EtcdMember: API_VERSION = '/v2/' DEFAULT_CLIENT_PORT = 2379 DEFAULT_PEER_PORT = 2380 + DEFAULT_METRICS_PORT = 2381 AG_TAG = 'aws:autoscaling:groupName' CF_TAG = 'aws:cloudformation:stack-name' @@ -56,6 +57,7 @@ def __init__(self, arg, region=None): self.client_port = self.DEFAULT_CLIENT_PORT self.peer_port = self.DEFAULT_PEER_PORT + self.metrics_port = self.DEFAULT_METRICS_PORT self.client_urls = [] # these values could be assigned only from the running etcd self.peer_urls = [] # cluster by performing http://addr:client_port/v2/members api call @@ -253,6 +255,8 @@ def etcd_arguments(self, data_dir, initial_cluster, cluster_state): self.peer_url, '-listen-client-urls', 'http://0.0.0.0:{}'.format(self.client_port), + '-listen-metrics-urls', + 'http://0.0.0.0:{}'.format(self.metrics_port), '-advertise-client-urls', self.get_client_url(), '-initial-cluster', From 7ab8bde9324538230ba527d2e840ce82881b7817 Mon Sep 17 00:00:00 2001 From: Martin Linkhorst Date: Wed, 28 Feb 2018 18:16:15 +0100 Subject: [PATCH 2/5] fix: enable metrics flag only when etcd is v3.3+ --- etcd.py | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/etcd.py b/etcd.py index df77afa..1b53497 100755 --- a/etcd.py +++ b/etcd.py @@ -244,7 +244,8 @@ def delete_member(self, member): return result def etcd_arguments(self, data_dir, initial_cluster, cluster_state): - return [ + # common flags that always have to be set + arguments = [ '-name', self.instance_id, '--data-dir', @@ -255,8 +256,6 @@ def etcd_arguments(self, data_dir, initial_cluster, cluster_state): self.peer_url, '-listen-client-urls', 'http://0.0.0.0:{}'.format(self.client_port), - '-listen-metrics-urls', - 'http://0.0.0.0:{}'.format(self.metrics_port), '-advertise-client-urls', self.get_client_url(), '-initial-cluster', @@ -267,6 +266,22 @@ def etcd_arguments(self, data_dir, initial_cluster, cluster_state): cluster_state ] + # this section handles etcd version specific flags + etcdversion = os.environ.get('ETCDVERSION') + if etcdversion: + etcdversion = list(map(lambda x: int(x), etcdversion.split('.'))) + # don't try to add additonal flags if we encounter an unexpected version format + if len(etcdversion) == 3: + # etcd >= v3.3: serve metrics on an additonal port + if etcdversion[0] >= 3 and etcdversion[1] >= 3: + arguments += [ + '-listen-metrics-urls', + 'http://0.0.0.0:{}'.format(self.metrics_port), + ] + + # return final list of arguments + return arguments + class EtcdCluster: REGIONS = [] # more then one (1) Region if this a Multi-Region-Cluster From 0a914150be28b93ff77b56747b0cf09a010138dc Mon Sep 17 00:00:00 2001 From: Martin Linkhorst Date: Thu, 1 Mar 2018 12:32:00 +0100 Subject: [PATCH 3/5] fix: cleanup detection of etcd version --- etcd.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/etcd.py b/etcd.py index 1b53497..e57acc6 100755 --- a/etcd.py +++ b/etcd.py @@ -269,15 +269,13 @@ def etcd_arguments(self, data_dir, initial_cluster, cluster_state): # this section handles etcd version specific flags etcdversion = os.environ.get('ETCDVERSION') if etcdversion: - etcdversion = list(map(lambda x: int(x), etcdversion.split('.'))) - # don't try to add additonal flags if we encounter an unexpected version format - if len(etcdversion) == 3: - # etcd >= v3.3: serve metrics on an additonal port - if etcdversion[0] >= 3 and etcdversion[1] >= 3: - arguments += [ - '-listen-metrics-urls', - 'http://0.0.0.0:{}'.format(self.metrics_port), - ] + etcdversion = tuple(int(x) for x in etcdversion.split('.')) + # etcd >= v3.3: serve metrics on an additonal port + if etcdversion >= (3, 3): + arguments += [ + '-listen-metrics-urls', + 'http://0.0.0.0:{}'.format(self.metrics_port), + ] # return final list of arguments return arguments From d8e6c10f593d920d41d90a9ba57d54e413c6a67a Mon Sep 17 00:00:00 2001 From: Martin Linkhorst Date: Tue, 6 Mar 2018 15:14:03 +0100 Subject: [PATCH 4/5] fix: ensure that correct flags are used when upgrading as well --- etcd.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/etcd.py b/etcd.py index e57acc6..9728452 100755 --- a/etcd.py +++ b/etcd.py @@ -243,7 +243,7 @@ def delete_member(self, member): self.adjust_security_groups('revoke_ingress', member) return result - def etcd_arguments(self, data_dir, initial_cluster, cluster_state): + def etcd_arguments(self, data_dir, initial_cluster, cluster_state, run_old)): # common flags that always have to be set arguments = [ '-name', @@ -267,7 +267,7 @@ def etcd_arguments(self, data_dir, initial_cluster, cluster_state): ] # this section handles etcd version specific flags - etcdversion = os.environ.get('ETCDVERSION') + etcdversion = os.environ.get('ETCDVERSION_PREV' if run_old else 'ETCDVERSION') if etcdversion: etcdversion = tuple(int(x) for x in etcdversion.split('.')) # etcd >= v3.3: serve metrics on an additonal port @@ -471,7 +471,7 @@ def register_me(self, cluster): peers = ','.join(['{}={}'.format(m.instance_id or m.name, m.peer_url) for m in cluster.members if (include_ec2_instances and m.instance_id) or m.peer_urls]) - return self.me.etcd_arguments(self.DATA_DIR, peers, cluster_state) + return self.me.etcd_arguments(self.DATA_DIR, peers, cluster_state, self.run_old) def run(self): cluster = EtcdCluster(self) From 974f733969fce07c20601aa3ab9c1b5f68bb9278 Mon Sep 17 00:00:00 2001 From: Martin Linkhorst Date: Tue, 6 Mar 2018 15:40:17 +0100 Subject: [PATCH 5/5] fix: remove superflous closing parenthesis --- etcd.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etcd.py b/etcd.py index 9728452..922fea8 100755 --- a/etcd.py +++ b/etcd.py @@ -243,7 +243,7 @@ def delete_member(self, member): self.adjust_security_groups('revoke_ingress', member) return result - def etcd_arguments(self, data_dir, initial_cluster, cluster_state, run_old)): + def etcd_arguments(self, data_dir, initial_cluster, cluster_state, run_old): # common flags that always have to be set arguments = [ '-name',