Skip to main content

put the logging script in a shared repo

ID
9fc9edf
date
2023-09-08 10:27:03+00:00
author
Alex Chan <alex@alexwlchan.net>
parent
168f33c
message
put the logging script in a shared repo
changed files
2 files, 1 addition, 164 deletions

Changed files

wellcome/logs (110) → wellcome/logs (158)

diff --git a/wellcome/logs b/wellcome/logs
index 565fc1b..2dce463 100755
--- a/wellcome/logs
+++ b/wellcome/logs
@@ -4,4 +4,4 @@ set -o errexit
 set -o nounset
 
 _ensure_aws_credentials_are_fresh
-open_logging_cluster.py
+python3 ~/repos/platform-infrastructure/logging/open_logging_cluster.py

wellcome/open_logging_cluster.py (6273) → wellcome/open_logging_cluster.py (0)

diff --git a/wellcome/open_logging_cluster.py b/wellcome/open_logging_cluster.py
deleted file mode 100755
index e1cd56f..0000000
--- a/wellcome/open_logging_cluster.py
+++ /dev/null
@@ -1,163 +0,0 @@
-#!/usr/bin/env python3
-"""
-Open an app’s logs in the logging cluster.
-
-This script will:
-
-1.  Query the logging cluster for all ECS service/cluster names and all
-    Lambda function names
-
-2.  Offer them to the user as a pick list
-
-3.  When the user selects an item, open Kibana in their web browser with
-    appropriate filters for the selected item
-
-"""
-
-import json
-import os
-import sys
-import webbrowser
-
-import boto3  # boto3==1.24.85
-import httpx  # httpx==0.24.1
-from iterfzf import iterfzf  # iterfzf==0.5.0.20.0
-
-
-# Where to cache data between runs.
-#
-# Because running the ES query is moderately slow, the script caches
-# lookups here -- this allows the user to start selecting an item before
-# the latest data is loaded from Elasticsearch.
-CACHE_FILE = os.path.join(os.environ["HOME"], ".logging_cluster.json")
-
-
-def get_aws_session(*, role_arn):
-    sts_client = boto3.client("sts")
-    assumed_role_object = sts_client.assume_role(
-        RoleArn=role_arn, RoleSessionName="AssumeRoleSession1"
-    )
-    credentials = assumed_role_object["Credentials"]
-
-    return boto3.Session(
-        aws_access_key_id=credentials["AccessKeyId"],
-        aws_secret_access_key=credentials["SecretAccessKey"],
-        aws_session_token=credentials["SessionToken"],
-    )
-
-
-def get_secret_string(sess, **kwargs):
-    """
-    Look up a SecretString from Secrets Manager, and return the string.
-    """
-    secrets = sess.client("secretsmanager")
-
-    resp = secrets.get_secret_value(**kwargs)
-
-    return resp["SecretString"]
-
-
-def get_logging_options_from_es():
-    sess = get_aws_session(role_arn="arn:aws:iam::760097843905:role/platform-developer")
-
-    logging_config = {
-        key: get_secret_string(sess, SecretId=f"shared/logging/es_{key}")
-        for key in ("host", "port", "user", "pass")
-    }
-
-    endpoint = f"https://{logging_config['host']}:{logging_config['port']}"
-
-    resp = httpx.request(
-        "GET",
-        f"{endpoint}/service-logs-*/_search",
-        auth=(logging_config["user"], logging_config["pass"]),
-        json={
-            "size": 0,
-            "aggs": {
-                "ecs_services": {
-                    "terms": {"field": "service_name.keyword", "size": 1000},
-                    "aggs": {
-                        "ecs_cluster": {
-                            "terms": {"field": "ecs_cluster.keyword", "size": 1}
-                        }
-                    },
-                },
-                "lambdas": {"terms": {"field": "service.keyword", "size": 100}},
-            },
-        },
-    ).json()
-
-    result = {}
-
-    for bucket in resp["aggregations"]["ecs_services"]["buckets"]:
-        service_name = bucket["key"]
-        cluster_name = bucket["ecs_cluster"]["buckets"][0]["key"]
-        label = f"{service_name} ({cluster_name})"
-
-        result[cluster_name] = {
-            "type": "ecs_cluster",
-            "cluster_name": cluster_name,
-        }
-
-        result[label] = {
-            "type": "ecs_service",
-            "service_name": service_name,
-            "cluster_name": cluster_name,
-        }
-
-    for bucket in resp["aggregations"]["lambdas"]["buckets"]:
-        function_name = bucket["key"]
-        result[function_name] = {
-            "type": "lambda",
-            "function_name": function_name,
-        }
-
-    return result
-
-
-def get_logging_options():
-    try:
-        with open(CACHE_FILE) as infile:
-            cached_entries = json.load(infile)
-    except FileNotFoundError:
-        cached_entries = {}
-
-    yield from cached_entries.items()
-
-    try:
-        new_entries = get_logging_options_from_es()
-    except Exception as e:
-        new_entries = {}
-
-    for k, v in new_entries.items():
-        if k not in cached_entries:
-            yield (k, v)
-
-    updated_entries = {**cached_entries, **new_entries}
-
-    with open(CACHE_FILE, "w") as outfile:
-        outfile.write(json.dumps(updated_entries, indent=2, sort_keys=True))
-
-
-if __name__ == "__main__":
-    choice = iterfzf(label for (label, _) in get_logging_options())
-
-    if choice is None:
-        sys.exit(0)
-
-    with open(CACHE_FILE) as infile:
-        es_info = json.load(infile)[choice]
-
-    if es_info["type"] == "ecs_service":
-        cluster_name = es_info["cluster_name"]
-        service_name = es_info["service_name"]
-
-        url = f"https://logging.wellcomecollection.org/app/discover#/?_g=(filters:!(),refreshInterval:(pause:!t,value:0),time:(from:now-15m,to:now))&_a=(columns:!(log),filters:!(('$state':(store:appState),meta:(alias:!n,disabled:!f,index:cb5ba262-ec15-46e3-a4c5-5668d65fe21f,key:ecs_cluster,negate:!f,params:(query:{cluster_name}),type:phrase),query:(match_phrase:(ecs_cluster:{cluster_name}))),('$state':(store:appState),meta:(alias:!n,disabled:!f,index:cb5ba262-ec15-46e3-a4c5-5668d65fe21f,key:service_name,negate:!f,params:(query:{service_name}),type:phrase),query:(match_phrase:(service_name:{service_name})))),index:cb5ba262-ec15-46e3-a4c5-5668d65fe21f,interval:auto,query:(language:kuery,query:''),sort:!(!('@timestamp',desc)))"
-    elif es_info["type"] == "ecs_cluster":
-        cluster_name = es_info["cluster_name"]
-        url = f"https://logging.wellcomecollection.org/app/discover#/?_g=(filters:!(),refreshInterval:(pause:!t,value:0),time:(from:now-15m,to:now))&_a=(columns:!(service_name,log),filters:!(('$state':(store:appState),meta:(alias:!n,disabled:!f,index:cb5ba262-ec15-46e3-a4c5-5668d65fe21f,key:ecs_cluster,negate:!f,params:(query:{cluster_name}),type:phrase),query:(match_phrase:(ecs_cluster:{cluster_name})))),index:cb5ba262-ec15-46e3-a4c5-5668d65fe21f,interval:auto,query:(language:kuery,query:''),sort:!(!('@timestamp',desc)))"
-    elif es_info["type"] == "lambda":
-        function_name = es_info["function_name"].replace("/", "%2F")
-        url = f"https://logging.wellcomecollection.org/app/discover#/?_g=(filters:!(),refreshInterval:(pause:!t,value:0),time:(from:now-15m,to:now))&_a=(columns:!(log),filters:!(('$state':(store:appState),meta:(alias:!n,disabled:!f,index:cb5ba262-ec15-46e3-a4c5-5668d65fe21f,key:service,negate:!f,params:(query:{function_name}),type:phrase),query:(match_phrase:(service:{function_name})))),index:cb5ba262-ec15-46e3-a4c5-5668d65fe21f,interval:auto,query:(language:kuery,query:''),sort:!(!('@timestamp',desc)))"
-
-    webbrowser.open(url)