From 02b0e46f116e7e75e22adf6a5c2364d5ab171a05 Mon Sep 17 00:00:00 2001 From: itakserman-cloudinary Date: Wed, 7 Aug 2024 11:32:44 +0300 Subject: [PATCH 01/20] Initial commit --- .gitignore | 4 +- lambda/app.py | 233 ++++++++-------------------------- lambda/requirements.txt | 3 +- lambda/tests/__init__.py | 0 lambda/tests/requirements.txt | 8 ++ lambda/tests/test_app.py | 115 +++++++++++++++++ 6 files changed, 180 insertions(+), 183 deletions(-) create mode 100644 lambda/tests/__init__.py create mode 100644 lambda/tests/requirements.txt create mode 100644 lambda/tests/test_app.py diff --git a/.gitignore b/.gitignore index eafe382..86c9cd7 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,6 @@ assets/cloudwatch-dashboard.rendered.json samconfig.toml .aws-sam .env.local.json -events/my.event.json \ No newline at end of file +events/my.event.json +lambda/tests/.pytest_cache +lambda/tests/test_db \ No newline at end of file diff --git a/lambda/app.py b/lambda/app.py index f0de489..82ef1dd 100644 --- a/lambda/app.py +++ b/lambda/app.py @@ -1,20 +1,16 @@ -import json import boto3 from datetime import datetime, timezone from pyiceberg.catalog.glue import GlueCatalog +from pyiceberg.table import Table +from pyiceberg.table.snapshots import Snapshot import os -import time -import uuid -import pandas as pd -import numpy as np +import pyarrow.compute as pc import logging logger = logging.getLogger() logger.setLevel(logging.INFO) -glue_client = boto3.client('glue') - -required_vars = ['CW_NAMESPACE', 'GLUE_SERVICE_ROLE', 'SPARK_CATALOG_S3_WAREHOUSE'] +required_vars = ['CW_NAMESPACE'] for var in required_vars: # Retrieve the environment variable value if os.getenv(var) is None: @@ -22,12 +18,6 @@ raise EnvironmentError(f"Required environment variable '{var}' is not set.") cw_namespace = os.environ.get('CW_NAMESPACE') -glue_service_role = os.environ.get('GLUE_SERVICE_ROLE') -warehouse_path = os.environ.get('SPARK_CATALOG_S3_WAREHOUSE') - -glue_session_tags = { - "app": "monitor-iceberg" -} def send_custom_metric( metric_name, dimensions, value, unit, namespace, timestamp=None): """ @@ -58,69 +48,20 @@ def send_custom_metric( metric_name, dimensions, value, unit, namespace, timesta Namespace=namespace, MetricData=[metric_data] ) - -def wait_for_session(session_id,interval=1): - while True: - response = glue_client.get_session( - Id=session_id - ) - status = response["Session"]["Status"] - if status in ['READY','FAILED','TIMEOUT','STOPPED']: - logger.info(f"Session {session_id} status={status}") - break - time.sleep(interval) - -def wait_for_statement(session_id,statement_id,interval=1): - while True: - response = glue_client.get_statement( - SessionId=session_id, - Id=statement_id, - ) - status = response["Statement"]["State"] - if status in ['AVAILABLE','CANCELLED','ERROR']: - logger.info(f"Statement status={status}") - return response - time.sleep(interval) - - - -def parse_spark_show_output(output): - lines = output.strip().split('\n') - header = lines[1] # Column names are typically in the second line - columns = [col.strip() for col in header.split('|') if col.strip()] # Clean and split by '|' + - data = [] - # Start reading data from the third line and skip the last line which is a border - for row in lines[3:-1]: - # Remove border and split - row_data = [cell.strip() for cell in row.split('|') if cell.strip()] - if row_data: - data.append(row_data) - - # Create DataFrame - return pd.DataFrame(data, columns=columns) - -def send_files_metrics(glue_db_name, glue_table_name, snapshot,session_id): - sql_stmt = f"SELECT CAST(AVG(record_count) as INT) as avg_record_count, MAX(record_count) as max_record_count, MIN(record_count) as min_record_count, CAST(AVG(file_size_in_bytes) as INT) as avg_file_size, MAX(file_size_in_bytes) as max_file_size, MIN(file_size_in_bytes) as min_file_size FROM glue_catalog.{glue_db_name}.{glue_table_name}.files" - run_stmt_response = glue_client.run_statement( - SessionId=session_id, - Code=f"df = spark.sql(\"{sql_stmt}\");df.show(df.count(),truncate=False)" - ) - stmt_id = run_stmt_response["Id"] - logger.info(f"select files statement_id={stmt_id}") - stmt_response = wait_for_statement(session_id, run_stmt_response["Id"]) - data_str = stmt_response["Statement"]["Output"]["Data"]["TextPlain"] - logger.info(stmt_response) - df = parse_spark_show_output(data_str) - df = df.applymap(int) +def send_files_metrics(table: Table, snapshot: Snapshot): + logger.info(f"send_files_metrics() -> snapshot_id={snapshot.snapshot_id}") + df = table.inspect.files().to_pandas() file_metrics = { - "avg_record_count": df.iloc[0]["avg_record_count"], - "max_record_count": df.iloc[0]["max_record_count"], - "min_record_count": df.iloc[0]["min_record_count"], - "avg_file_size": df.iloc[0]['avg_file_size'], - "max_file_size": df.iloc[0]['max_file_size'], - "min_file_size": df.iloc[0]['min_file_size'], + "avg_record_count": df["record_count"].astype(int).mean().astype(int), + "max_record_count": df["record_count"].astype(int).max(), + "min_record_count": df["record_count"].astype(int).min(), + "avg_file_size": df['file_size_in_bytes'].astype(int).mean().astype(int), + "max_file_size": df['file_size_in_bytes'].astype(int).max(), + "min_file_size": df['file_size_in_bytes'].astype(int).min() } + logger.info("file_metrics=") logger.info(file_metrics) # loop over file_metrics, use key as metric name and value as metric value @@ -130,32 +71,24 @@ def send_files_metrics(glue_db_name, glue_table_name, snapshot,session_id): send_custom_metric( metric_name=f"files.{metric_name}", dimensions=[ - {'Name': 'table_name', 'Value': f"{glue_db_name}.{glue_table_name}"} + {'Name': 'table_name', 'Value': f"{table.name()[1]}.{table.name()[2]}"} ], value=metric_value.item(), unit='Bytes' if "size" in metric_name else "Count", - namespace=os.getenv('CW_NAMESPACE'), + namespace=cw_namespace, timestamp = snapshot.timestamp_ms, ) - -def send_partition_metrics(glue_db_name, glue_table_name, snapshot,session_id): - sql_stmt = f"select partition,record_count,file_count from glue_catalog.{glue_db_name}.{glue_table_name}.partitions" - run_stmt_response = glue_client.run_statement( - SessionId=session_id, - Code=f"df = spark.sql(\"{sql_stmt}\");df.show(df.count(),truncate=False)" - ) + return file_metrics - stmt_id = run_stmt_response["Id"] - logger.info(f"send_partition_metrics() -> statement_id={stmt_id}") - stmt_response = wait_for_statement(session_id, stmt_id) - data_str = stmt_response["Statement"]["Output"]["Data"]["TextPlain"] - if data_str == "": +def send_partition_metrics(table: Table, snapshot: Snapshot): + logger.info(f"send_partition_metrics() -> snapshot_id={snapshot.snapshot_id}") + if not table.metadata.partition_specs: logger.info("No partitions found") return - df = parse_spark_show_output(data_str) + df = table.inspect.partitions().to_pandas() partition_metrics = { "avg_record_count": df["record_count"].astype(int).mean().astype(int), "max_record_count": df["record_count"].astype(int).max(), @@ -168,6 +101,7 @@ def send_partition_metrics(glue_db_name, glue_table_name, snapshot,session_id): "deviation_file_count": df['file_count'].astype(int).std().round(2), "skew_file_count": df['file_count'].astype(int).skew().round(2), } + logger.info("partition_metrics=") logger.info(partition_metrics) @@ -177,11 +111,11 @@ def send_partition_metrics(glue_db_name, glue_table_name, snapshot,session_id): send_custom_metric( metric_name=f"partitions.{metric_name}", dimensions=[ - {'Name': 'table_name', 'Value': f"{glue_db_name}.{glue_table_name}"} + {'Name': 'table_name', 'Value': f"{table.name()[1]}.{table.name()[2]}"} ], value=metric_value.item(), unit='Count', - namespace=os.getenv('CW_NAMESPACE'), + namespace=cw_namespace, timestamp = snapshot.timestamp_ms, ) @@ -194,103 +128,39 @@ def send_partition_metrics(glue_db_name, glue_table_name, snapshot,session_id): send_custom_metric( metric_name=f"partitions.record_count", dimensions=[ - {'Name': 'table_name', 'Value': f"{glue_db_name}.{glue_table_name}"}, + {'Name': 'table_name', 'Value': f"{table.name()[1]}.{table.name()[2]}"}, {'Name': 'partition_name', 'Value': partition_name} ], value=int(record_count), unit='Count', - namespace=os.getenv('CW_NAMESPACE'), + namespace=cw_namespace, timestamp = snapshot.timestamp_ms, ) send_custom_metric( metric_name=f"partitions.file_count", dimensions=[ - {'Name': 'table_name', 'Value': f"{glue_db_name}.{glue_table_name}"}, + {'Name': 'table_name', 'Value': f"{table.name()[1]}.{table.name()[2]}"}, {'Name': 'partition_name', 'Value': partition_name} ], value=int(file_count), unit='Count', - namespace=os.getenv('CW_NAMESPACE'), + namespace=cw_namespace, timestamp = snapshot.timestamp_ms, ) - -def get_all_sessions(): - sessions = [] - next_token = None - - while True: - if next_token: - response = glue_client.list_sessions(Tags=glue_session_tags, NextToken=next_token) - else: - response = glue_client.list_sessions(Tags=glue_session_tags) - - sessions.extend(response['Sessions']) - next_token = response.get('NextToken') - - if not next_token: - break - return sessions + return partition_metrics -def create_or_reuse_glue_session(): - session_id = None - - glue_sessions = get_all_sessions() - - for session in glue_sessions: - if(session["Status"] == "READY"): - session_id = session["Id"] - logger.info(f"Found existing session_id={session_id}") - break - - if(session_id is None): - generated_uuid_string = str(uuid.uuid4()) - session_id = f"iceberg-metadata-lambda-{generated_uuid_string}" - logger.info(f"No active Glue session found, creating new glue session with ID = {session_id}") - glue_client.create_session( - Id=session_id, - Role=glue_service_role, - Command={'Name': 'glueetl', "PythonVersion": "3"}, - Timeout=120, - DefaultArguments={ - "--enable-glue-datacatalog": "true", - "--enable-observability-metrics": "true", - "--conf": f"spark.sql.catalog.glue_catalog=org.apache.iceberg.spark.SparkCatalog --conf spark.sql.catalog.glue_catalog.warehouse={warehouse_path} --conf spark.sql.catalog.glue_catalog.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog --conf spark.sql.catalog.glue_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions", - "--datalake-formats": "iceberg" - }, - GlueVersion="4.0", - NumberOfWorkers=2, - WorkerType="G.1X", - IdleTimeout=30, - Tags=glue_session_tags, - ) - wait_for_session(session_id) - return session_id - -def dt_to_ts(dt_str): - dt_obj = datetime.fromisoformat(dt_str.replace('Z', '+00:00')) - timestamp_seconds = dt_obj.timestamp() - return int(timestamp_seconds * 1000) - - -def send_snapshot_metrics(glue_db_name, glue_table_name, snapshot_id, session_id): +def send_snapshot_metrics(table: Table, snapshot: Snapshot): logger.info("send_snapshot_metrics") - sql_stmt = f"select committed_at,snapshot_id,operation,summary from glue_catalog.{glue_db_name}.{glue_table_name}.snapshots where snapshot_id={snapshot_id}" - logger.debug(sql_stmt) - run_stmt_response = glue_client.run_statement( - SessionId=session_id, - Code=f"df=spark.sql(\"{sql_stmt}\");json_rdd=df.toJSON();json_strings=json_rdd.collect();print(json_strings)" - ) - stmt_id = run_stmt_response["Id"] - logger.info(f"send_snapshot_metrics() -> statement_id={stmt_id}") - stmt_response = wait_for_statement(session_id, stmt_id) - json_list_str = stmt_response["Statement"]["Output"]["Data"]["TextPlain"].replace("\'", "") - snapshots = json.loads(json_list_str) - logger.info("send_snapshot_metrics()->response") - logger.info(json.dumps(snapshots, indent=4)) - snapshot = snapshots[0] + snapshot_id = snapshot.snapshot_id + logger.info(f"send_snapshot_metrics() -> snapshot_id={snapshot_id}") + expr = pc.field("snapshot_id") == snapshot_id + snapshots = table.inspect.snapshots().filter(expr).to_pylist() + snapshot_metrics = snapshots[0] + snapshot_metrics["summary"] = dict(snapshot_metrics["summary"]) + metrics = [ "added-data-files", "added-records", "changed-partition-count", @@ -299,24 +169,26 @@ def send_snapshot_metrics(glue_db_name, glue_table_name, snapshot_id, session_id ] for metric in metrics: normalized_metric_name = metric.replace("-", "_") - if snapshot["summary"].get(metric) is None: - snapshot["summary"][metric] = 0 - metric_value = snapshot["summary"][metric] - timestamp_ms = dt_to_ts(snapshot["committed_at"]) + if snapshot_metrics["summary"].get(metric) is None: + snapshot_metrics["summary"][metric] = 0 + metric_value = snapshot_metrics["summary"][metric] logger.info(f"metric_name=snapshot.{normalized_metric_name}, value={metric_value}") send_custom_metric( metric_name=f"snapshot.{normalized_metric_name}", dimensions=[ - {'Name': 'table_name', 'Value': f"{glue_db_name}.{glue_table_name}"} + {'Name': 'table_name', 'Value': f"{table.name()[1]}.{table.name()[2]}"} ], value=int(metric_value), unit='Bytes' if "size" in normalized_metric_name else "Count", - namespace=os.getenv('CW_NAMESPACE'), - timestamp = timestamp_ms, - ) + namespace=cw_namespace, + timestamp = snapshot.timestamp_ms, + ) + + return snapshot_metrics # check if glue table is of iceberg format, return boolean def check_table_is_of_iceberg_format(event): + glue_client = boto3.client('glue') response = glue_client.get_table( DatabaseName=event["detail"]["databaseName"], Name=event["detail"]["tableName"], @@ -342,11 +214,10 @@ def lambda_handler(event, context): catalog = GlueCatalog(glue_db_name) table = catalog.load_table((glue_db_name, glue_table_name)) - logger.info(f"current snapshot id={table.metadata.current_snapshot_id}") snapshot = table.metadata.snapshot_by_id(table.metadata.current_snapshot_id) + logger.info(f"current snapshot id={snapshot.snapshot_id}") logger.info("Using glue IS to produce metrics") - session_id = create_or_reuse_glue_session() - send_snapshot_metrics(glue_db_name, glue_table_name, table.metadata.current_snapshot_id, session_id) - send_partition_metrics(glue_db_name, glue_table_name, snapshot,session_id) - send_files_metrics(glue_db_name, glue_table_name, snapshot,session_id) \ No newline at end of file + send_snapshot_metrics(table, snapshot) + send_partition_metrics(table, snapshot) + send_files_metrics(table, snapshot) \ No newline at end of file diff --git a/lambda/requirements.txt b/lambda/requirements.txt index 83afb4f..6ff4cc3 100644 --- a/lambda/requirements.txt +++ b/lambda/requirements.txt @@ -2,4 +2,5 @@ boto3==1.34.51 botocore==1.34.51 pyiceberg[s3fs,glue] pandas -typing_extensions \ No newline at end of file +typing_extensions +pyarrow \ No newline at end of file diff --git a/lambda/tests/__init__.py b/lambda/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lambda/tests/requirements.txt b/lambda/tests/requirements.txt new file mode 100644 index 0000000..2962d8f --- /dev/null +++ b/lambda/tests/requirements.txt @@ -0,0 +1,8 @@ +boto3==1.34.51 +moto==5.0.12 +pyiceberg[s3fs]==0.7.0 +SQLAlchemy==2.0.30 +pyarrow==17.0.0 +pandas==2.2.2 +pytest==7.1.2 +unittest2==1.1.0 \ No newline at end of file diff --git a/lambda/tests/test_app.py b/lambda/tests/test_app.py new file mode 100644 index 0000000..a742c00 --- /dev/null +++ b/lambda/tests/test_app.py @@ -0,0 +1,115 @@ +import os +import shutil +import unittest +from unittest.mock import patch +import boto3 +from moto import mock_aws +from pyiceberg.schema import Schema +from pyiceberg.types import LongType, StringType, NestedField +from pyiceberg.partitioning import PartitionField, PartitionSpec +from pyiceberg.catalog.sql import SqlCatalog +import pyarrow as pa +from app import send_files_metrics, send_partition_metrics, send_snapshot_metrics + +# Mock AWS credentials +os.environ['AWS_ACCESS_KEY_ID'] = 'testing' +os.environ['AWS_SECRET_ACCESS_KEY'] = 'testing' +os.environ['AWS_SECURITY_TOKEN'] = 'testing' +os.environ['AWS_SESSION_TOKEN'] = 'testing' + +class TestIcebergMetrics(unittest.TestCase): + + @mock_aws + @patch.dict(os.environ, {'CW_NAMESPACE': 'TestNamespace'}) + @patch('app.send_custom_metric') + def setUp(self, mock_send_custom_metric): + self.cloudwatch_client = boto3.client('cloudwatch', region_name=os.environ.get('GLUE_REGION')) + self.schema = Schema( + NestedField(1, 'id', LongType(), False), + NestedField(2, 'data', StringType(), False) + ) + self.partition_spec = PartitionSpec( + fields=[ + PartitionField(source_id=2, field_id=1000, name="data", transform="identity") + ] + ) + + catalog_path = './tests/test_db' + if os.path.exists(catalog_path): + shutil.rmtree(catalog_path) + os.makedirs(catalog_path) + warehouse_path = os.path.abspath(catalog_path) + self.catalog = SqlCatalog( + "default", + **{ + "uri": f"sqlite:///{warehouse_path}/pyiceberg_catalog.db", + "warehouse": f"file://{warehouse_path}", + }, + ) + self.catalog.create_namespace('default') + self.catalog.create_table( + 'default.test_table', + schema=self.schema, + partition_spec=self.partition_spec + ) + + # Load the table and insert some data + self.table = self.catalog.load_table(('default', 'test_table')) + self.update_table(0, 5) + + def create_arrow_table(self, range_start, range_end): + data = { + 'id': pa.array(range(range_start, range_end), pa.int64()), + 'data': pa.array(['data' + str(i) for i in range(range_start, range_end)], pa.string()) + } + return pa.Table.from_pydict(data) + + @patch('app.send_custom_metric') + def test_send_files_metrics(self, mock_send_custom_metric): + result = send_files_metrics(self.table, self.snapshot) + mock_send_custom_metric.assert_called() + self.assertIn('avg_record_count', result) + self.assertIn('max_record_count', result) + self.assertIn('avg_file_size', result) + self.assertIn('max_file_size', result) + + @patch('app.send_custom_metric') + def test_send_partition_metrics(self, mock_send_custom_metric): + result = send_partition_metrics(self.table, self.snapshot) + mock_send_custom_metric.assert_called() + self.assertIsNotNone(result) + + @patch('app.send_custom_metric') + def test_send_snapshot_metrics(self, mock_send_custom_metric): + result = send_snapshot_metrics(self.table, self.snapshot) + mock_send_custom_metric.assert_called() + self.assertIsNotNone(result) + + def update_table(self, range_start, range_end): + # Perform an update operation on the Iceberg table + arrow_table = self.create_arrow_table(range_start, range_end) + self.table.append(arrow_table) + self.table.refresh() + self.snapshot = self.table.current_snapshot() + + @patch('app.send_custom_metric') + def test_metrics_after_update(self, mock_send_custom_metric): + self.update_table(5, 10) + + result_files_metrics = send_files_metrics(self.table, self.snapshot) + mock_send_custom_metric.assert_called() + self.assertIn('avg_record_count', result_files_metrics) + self.assertIn('max_record_count', result_files_metrics) + self.assertIn('avg_file_size', result_files_metrics) + self.assertIn('max_file_size', result_files_metrics) + + result_partition_metrics = send_partition_metrics(self.table, self.snapshot) + mock_send_custom_metric.assert_called() + self.assertIsNotNone(result_partition_metrics) + + result_snapshot_metrics = send_snapshot_metrics(self.table, self.snapshot) + mock_send_custom_metric.assert_called() + self.assertIsNotNone(result_snapshot_metrics) + +if __name__ == '__main__': + unittest.main() From dbc81f9914f1e1d9b97c271365506a82f7d12d4c Mon Sep 17 00:00:00 2001 From: itakserman-cloudinary Date: Wed, 7 Aug 2024 13:45:46 +0300 Subject: [PATCH 02/20] finalize tests --- lambda/app.py | 75 ++++++++++++----------------------- lambda/tests/requirements.txt | 4 +- lambda/tests/test_app.py | 67 +++++++++++++++---------------- 3 files changed, 59 insertions(+), 87 deletions(-) diff --git a/lambda/app.py b/lambda/app.py index 82ef1dd..6bfb268 100644 --- a/lambda/app.py +++ b/lambda/app.py @@ -1,4 +1,5 @@ import boto3 +from numbers import Number from datetime import datetime, timezone from pyiceberg.catalog.glue import GlueCatalog from pyiceberg.table import Table @@ -49,6 +50,21 @@ def send_custom_metric( metric_name, dimensions, value, unit, namespace, timesta MetricData=[metric_data] ) +def send_metrics(metrics: dict, namespace: str, table: Table, snapshot: Snapshot): + for metric_name, metric_value in metrics.items(): + if not isinstance(metric_value, Number): + metric_value = metric_value.item() + logger.info(f"metric_name={namespace}.{metric_name}, metric_value={metric_value}") + send_custom_metric( + metric_name=f"{namespace}.{metric_name}", + dimensions=[ + {'Name': 'table_name', 'Value': f"{table.name()[1]}.{table.name()[2]}"} + ], + value=metric_value, + unit='Bytes' if "size" in metric_name else "Count", + namespace=cw_namespace, + timestamp = snapshot.timestamp_ms, + ) def send_files_metrics(table: Table, snapshot: Snapshot): logger.info(f"send_files_metrics() -> snapshot_id={snapshot.snapshot_id}") @@ -64,22 +80,7 @@ def send_files_metrics(table: Table, snapshot: Snapshot): logger.info("file_metrics=") logger.info(file_metrics) - # loop over file_metrics, use key as metric name and value as metric value - # loop over partition_metrics, use key as metric name and value as metric value - for metric_name, metric_value in file_metrics.items(): - logger.info(f"metric_name=files.{metric_name}, metric_value={metric_value.item()}") - send_custom_metric( - metric_name=f"files.{metric_name}", - dimensions=[ - {'Name': 'table_name', 'Value': f"{table.name()[1]}.{table.name()[2]}"} - ], - value=metric_value.item(), - unit='Bytes' if "size" in metric_name else "Count", - namespace=cw_namespace, - timestamp = snapshot.timestamp_ms, - ) - - return file_metrics + send_metrics(file_metrics, "files", table, snapshot) def send_partition_metrics(table: Table, snapshot: Snapshot): @@ -105,19 +106,7 @@ def send_partition_metrics(table: Table, snapshot: Snapshot): logger.info("partition_metrics=") logger.info(partition_metrics) - # loop over aggregated partition_metrics, use key as metric name and value as metric value - for metric_name, metric_value in partition_metrics.items(): - logger.info(f"metric_name=partitions.{metric_name}, metric_value={metric_value.item()}") - send_custom_metric( - metric_name=f"partitions.{metric_name}", - dimensions=[ - {'Name': 'table_name', 'Value': f"{table.name()[1]}.{table.name()[2]}"} - ], - value=metric_value.item(), - unit='Count', - namespace=cw_namespace, - timestamp = snapshot.timestamp_ms, - ) + send_metrics(partition_metrics, "partitions", table, snapshot) for index, row in df.iterrows(): partition_name = row['partition'] @@ -158,33 +147,19 @@ def send_snapshot_metrics(table: Table, snapshot: Snapshot): logger.info(f"send_snapshot_metrics() -> snapshot_id={snapshot_id}") expr = pc.field("snapshot_id") == snapshot_id snapshots = table.inspect.snapshots().filter(expr).to_pylist() - snapshot_metrics = snapshots[0] - snapshot_metrics["summary"] = dict(snapshot_metrics["summary"]) - - + snapshot_metrics_obj = snapshots[0] + snapshot_metrics = dict(snapshot_metrics_obj["summary"]) metrics = [ "added-data-files", "added-records", "changed-partition-count", "total-records","total-data-files", "total-delete-files", "added-files-size", "total-files-size", "added-position-deletes" ] - for metric in metrics: - normalized_metric_name = metric.replace("-", "_") - if snapshot_metrics["summary"].get(metric) is None: - snapshot_metrics["summary"][metric] = 0 - metric_value = snapshot_metrics["summary"][metric] - logger.info(f"metric_name=snapshot.{normalized_metric_name}, value={metric_value}") - send_custom_metric( - metric_name=f"snapshot.{normalized_metric_name}", - dimensions=[ - {'Name': 'table_name', 'Value': f"{table.name()[1]}.{table.name()[2]}"} - ], - value=int(metric_value), - unit='Bytes' if "size" in normalized_metric_name else "Count", - namespace=cw_namespace, - timestamp = snapshot.timestamp_ms, - ) + snapshot_metrics = { k.replace("-", "_"): int(snapshot_metrics.get(k, 0)) for k in metrics } - return snapshot_metrics + logger.info("snapshot_metrics=") + logger.info(snapshot_metrics) + send_metrics(snapshot_metrics, "snapshots", table, snapshot) + # check if glue table is of iceberg format, return boolean def check_table_is_of_iceberg_format(event): diff --git a/lambda/tests/requirements.txt b/lambda/tests/requirements.txt index 2962d8f..eab03a0 100644 --- a/lambda/tests/requirements.txt +++ b/lambda/tests/requirements.txt @@ -1,8 +1,6 @@ -boto3==1.34.51 -moto==5.0.12 pyiceberg[s3fs]==0.7.0 SQLAlchemy==2.0.30 pyarrow==17.0.0 -pandas==2.2.2 +pandas==2.2.2 pytest==7.1.2 unittest2==1.1.0 \ No newline at end of file diff --git a/lambda/tests/test_app.py b/lambda/tests/test_app.py index a742c00..64415d1 100644 --- a/lambda/tests/test_app.py +++ b/lambda/tests/test_app.py @@ -1,13 +1,13 @@ import os import shutil import unittest +from numbers import Number from unittest.mock import patch -import boto3 -from moto import mock_aws from pyiceberg.schema import Schema from pyiceberg.types import LongType, StringType, NestedField from pyiceberg.partitioning import PartitionField, PartitionSpec from pyiceberg.catalog.sql import SqlCatalog +import numpy as np import pyarrow as pa from app import send_files_metrics, send_partition_metrics, send_snapshot_metrics @@ -19,11 +19,8 @@ class TestIcebergMetrics(unittest.TestCase): - @mock_aws @patch.dict(os.environ, {'CW_NAMESPACE': 'TestNamespace'}) - @patch('app.send_custom_metric') - def setUp(self, mock_send_custom_metric): - self.cloudwatch_client = boto3.client('cloudwatch', region_name=os.environ.get('GLUE_REGION')) + def setUp(self): self.schema = Schema( NestedField(1, 'id', LongType(), False), NestedField(2, 'data', StringType(), False) @@ -57,6 +54,7 @@ def setUp(self, mock_send_custom_metric): self.table = self.catalog.load_table(('default', 'test_table')) self.update_table(0, 5) + def create_arrow_table(self, range_start, range_end): data = { 'id': pa.array(range(range_start, range_end), pa.int64()), @@ -64,26 +62,31 @@ def create_arrow_table(self, range_start, range_end): } return pa.Table.from_pydict(data) - @patch('app.send_custom_metric') - def test_send_files_metrics(self, mock_send_custom_metric): - result = send_files_metrics(self.table, self.snapshot) - mock_send_custom_metric.assert_called() - self.assertIn('avg_record_count', result) - self.assertIn('max_record_count', result) - self.assertIn('avg_file_size', result) - self.assertIn('max_file_size', result) + + def assert_metrics(self, expected, table, snapshot, method_to_test): + def send_metrics_stub(metrics, namespace, table, snapshot): + metrics = {k: v.item() if not isinstance(v, Number) else v for k, v in metrics.items()} + self.assertDictEqual(metrics, expected) + + with patch('app.send_metrics', side_effect=send_metrics_stub): + method_to_test(table, snapshot) + + + def test_send_files_metrics(self): + expected_file_metrics = {'avg_record_count': np.int64(1), 'max_record_count': np.int64(1), 'min_record_count': np.int64(1), 'avg_file_size': np.int64(1068), 'max_file_size': np.int64(1068), 'min_file_size': np.int64(1068)} + self.assert_metrics(expected_file_metrics, self.table, self.snapshot, send_files_metrics) + @patch('app.send_custom_metric') def test_send_partition_metrics(self, mock_send_custom_metric): - result = send_partition_metrics(self.table, self.snapshot) - mock_send_custom_metric.assert_called() - self.assertIsNotNone(result) + expected_partition_metrics = {'avg_record_count': np.int64(1), 'max_record_count': np.int64(1), 'min_record_count': np.int64(1), 'deviation_record_count': np.float64(0.0), 'skew_record_count': np.float64(0.0), 'avg_file_count': np.int64(1), 'max_file_count': np.int64(1), 'min_file_count': np.int64(1), 'deviation_file_count': np.float64(0.0), 'skew_file_count': np.float64(0.0)} + self.assert_metrics(expected_partition_metrics, self.table, self.snapshot, send_partition_metrics) + + + def test_send_snapshot_metrics(self): + expected_snapshot_metrics = {'added_data_files': 5, 'added_records': 5, 'changed_partition_count': 5, 'total_records': 5, 'total_data_files': 5, 'total_delete_files': 0, 'added_files_size': 5340, 'total_files_size': 5340, 'added_position_deletes': 0} + self.assert_metrics(expected_snapshot_metrics, self.table, self.snapshot, send_snapshot_metrics) - @patch('app.send_custom_metric') - def test_send_snapshot_metrics(self, mock_send_custom_metric): - result = send_snapshot_metrics(self.table, self.snapshot) - mock_send_custom_metric.assert_called() - self.assertIsNotNone(result) def update_table(self, range_start, range_end): # Perform an update operation on the Iceberg table @@ -92,24 +95,20 @@ def update_table(self, range_start, range_end): self.table.refresh() self.snapshot = self.table.current_snapshot() + @patch('app.send_custom_metric') def test_metrics_after_update(self, mock_send_custom_metric): self.update_table(5, 10) - result_files_metrics = send_files_metrics(self.table, self.snapshot) - mock_send_custom_metric.assert_called() - self.assertIn('avg_record_count', result_files_metrics) - self.assertIn('max_record_count', result_files_metrics) - self.assertIn('avg_file_size', result_files_metrics) - self.assertIn('max_file_size', result_files_metrics) + expected_file_metrics = {'avg_record_count': np.int64(1), 'max_record_count': np.int64(1), 'min_record_count': np.int64(1), 'avg_file_size': np.int64(1068), 'max_file_size': np.int64(1068), 'min_file_size': np.int64(1068)} + self.assert_metrics(expected_file_metrics, self.table, self.snapshot, send_files_metrics) - result_partition_metrics = send_partition_metrics(self.table, self.snapshot) - mock_send_custom_metric.assert_called() - self.assertIsNotNone(result_partition_metrics) + expected_partition_metrics = {'avg_record_count': np.int64(1), 'max_record_count': np.int64(1), 'min_record_count': np.int64(1), 'deviation_record_count': np.float64(0.0), 'skew_record_count': np.float64(0.0), 'avg_file_count': np.int64(1), 'max_file_count': np.int64(1), 'min_file_count': np.int64(1), 'deviation_file_count': np.float64(0.0), 'skew_file_count': np.float64(0.0)} + self.assert_metrics(expected_partition_metrics, self.table, self.snapshot, send_partition_metrics) - result_snapshot_metrics = send_snapshot_metrics(self.table, self.snapshot) - mock_send_custom_metric.assert_called() - self.assertIsNotNone(result_snapshot_metrics) + expected_snapshot_metrics = {'added_data_files': 5, 'added_records': 5, 'changed_partition_count': 5, 'total_records': 10, 'total_data_files': 10, 'total_delete_files': 0, 'added_files_size': 5340, 'total_files_size': 10680, 'added_position_deletes': 0} + self.assert_metrics(expected_snapshot_metrics, self.table, self.snapshot, send_snapshot_metrics) + if __name__ == '__main__': unittest.main() From 53c13c8e533fbe1af682b0340fdab97a3ea9d81e Mon Sep 17 00:00:00 2001 From: itakserman-cloudinary Date: Wed, 7 Aug 2024 15:01:18 +0300 Subject: [PATCH 03/20] finalize tests --- lambda/tests/Dockerfile | 21 +++++++++++++++++++++ lambda/tests/requirements.txt | 4 +++- 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 lambda/tests/Dockerfile diff --git a/lambda/tests/Dockerfile b/lambda/tests/Dockerfile new file mode 100644 index 0000000..b542dd1 --- /dev/null +++ b/lambda/tests/Dockerfile @@ -0,0 +1,21 @@ +# Use an official Python runtime as a parent image +FROM python:3.10-slim + +# Set the working directory in the container +WORKDIR /lambda + +# Copy the current directory contents into the container at /app +COPY . /lambda + +# Install any needed packages specified in requirements.txt +RUN pip install --no-cache-dir -r tests/requirements.txt + +# Install SQLite +RUN apt-get update && \ + apt-get install -y sqlite3 + +ENV CW_NAMESPACE=TestNamespace \ + PYTHONPATH=/lambda + +# Run the test suite +CMD ["pytest", "/lambda/tests/test_app.py"] diff --git a/lambda/tests/requirements.txt b/lambda/tests/requirements.txt index eab03a0..27a54e5 100644 --- a/lambda/tests/requirements.txt +++ b/lambda/tests/requirements.txt @@ -1,4 +1,6 @@ -pyiceberg[s3fs]==0.7.0 +boto3==1.34.51 +botocore==1.34.51 +pyiceberg[s3fs,glue]==0.7.0 SQLAlchemy==2.0.30 pyarrow==17.0.0 pandas==2.2.2 From 649cd885c3c44a13744fdbacef58aa3ae6db9e7f Mon Sep 17 00:00:00 2001 From: itakserman-cloudinary Date: Wed, 7 Aug 2024 15:06:53 +0300 Subject: [PATCH 04/20] Adjust readme --- README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 91215bf..ec284c9 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,6 @@ This repository provides you with a sample solution that collects metrics of exi ### Solution Tenets * Solution is designed to provide time-series metrics for Apache Iceberg to monitor Apache Iceberg tables over-time to recognize trends and anomalies. * Solution is designed to be lightweight and collect metrics exclusively from Apache Iceberg metadata layer without scanning the data layer hense without the need for heavy compute capacity. -* In the future we strive to reduce the dependency on AWS Glue in favor of using AWS Lambda compute when required features are available in [PyIceberg](https://py.iceberg.apache.org) library. ### Technical implementation @@ -235,6 +234,15 @@ sam local invoke IcebergMetricsLambda --env-vars .env.local.json `.env.local.json` - The JSON file that contains values for the Lambda function's environment variables. Lambda code is dependent on env vars that you are passing in the deploy section. You need to create the file it and include relevant [parameters](#parameters) before you calling `sam local invoke`. +### Unit Tests + +You can test the metrics generation locally through unit-tests. From lambda folder - + +```bash +docker build -f tests/Dockerfile -t iceberg-metrics-tests . +docker run --rm iceberg-metrics-tests +``` + ## Dependencies PyIceberg is a Python implementation for accessing Iceberg tables, without the need of a JVM. \ From 0c8b47c30c00f4ae42db1087f86a59710ce80391 Mon Sep 17 00:00:00 2001 From: itakserman-cloudinary Date: Wed, 7 Aug 2024 15:37:31 +0300 Subject: [PATCH 05/20] slight updates --- lambda/app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lambda/app.py b/lambda/app.py index 6bfb268..b187889 100644 --- a/lambda/app.py +++ b/lambda/app.py @@ -189,7 +189,7 @@ def lambda_handler(event, context): catalog = GlueCatalog(glue_db_name) table = catalog.load_table((glue_db_name, glue_table_name)) - snapshot = table.metadata.snapshot_by_id(table.metadata.current_snapshot_id) + snapshot = table.current_snapshot() logger.info(f"current snapshot id={snapshot.snapshot_id}") logger.info("Using glue IS to produce metrics") From 4f6fab45060f4c252b325ccc9ae35150ae17a03f Mon Sep 17 00:00:00 2001 From: itakserman-cloudinary Date: Thu, 8 Aug 2024 09:39:03 +0300 Subject: [PATCH 06/20] Update template --- template.yaml | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/template.yaml b/template.yaml index 12a0981..d9de356 100644 --- a/template.yaml +++ b/template.yaml @@ -26,21 +26,6 @@ Resources: - AWSLambdaBasicExecutionRole - AmazonS3ReadOnlyAccess - Statement: - - Sid: GlueInteractiveSessionPolicy - Effect: Allow - Action: - - glue:GetSession - - glue:CreateSession - - glue:GetStatement - - glue:RunStatement - - glue:GetSession - - glue:ListStatements - Resource: !Sub 'arn:aws:glue:*:${AWS::AccountId}:session/*' - - Sid: IAMPassRoleForGlueIS - Effect: Allow - Action: - - iam:PassRole - Resource: !Ref GlueServiceRole - Sid: GlueDataCatalogPolicy Effect: Allow Action: @@ -59,8 +44,6 @@ Resources: Environment: Variables: CW_NAMESPACE: !Ref CWNamespace - GLUE_SERVICE_ROLE: !Ref GlueServiceRole - SPARK_CATALOG_S3_WAREHOUSE: !Ref Warehouse PermissionForEventBridgeToInvokeLambda: Type: AWS::Lambda::Permission Properties: From eb7230e5b86cd99cb36e7bc8d2b8aa5aee2a9792 Mon Sep 17 00:00:00 2001 From: itakserman-cloudinary Date: Thu, 8 Aug 2024 09:49:34 +0300 Subject: [PATCH 07/20] Update template --- template.yaml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/template.yaml b/template.yaml index d9de356..9399e9a 100644 --- a/template.yaml +++ b/template.yaml @@ -4,12 +4,6 @@ Parameters: CWNamespace: Description: Amazon CloudWatch custom metric namespace Type: String - GlueServiceRole: - Description: AWS Glue Service Role with permissions to create session. - Type: String - Warehouse: - Description: warehouse is a required catalog property to determine the root path of the data warehouse in storage. - Type: String Globals: Function: Timeout: 360 From 41fe55ef3ed76484b6018052ea55d472868de5fd Mon Sep 17 00:00:00 2001 From: itakserman-cloudinary Date: Thu, 8 Aug 2024 15:45:25 +0300 Subject: [PATCH 08/20] Adjust readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ec284c9..03ff4a1 100644 --- a/README.md +++ b/README.md @@ -239,6 +239,7 @@ sam local invoke IcebergMetricsLambda --env-vars .env.local.json You can test the metrics generation locally through unit-tests. From lambda folder - ```bash +cd lambda docker build -f tests/Dockerfile -t iceberg-metrics-tests . docker run --rm iceberg-metrics-tests ``` From e157ddb73e4b8321d54d81697be14393d5c99029 Mon Sep 17 00:00:00 2001 From: itakserman-cloudinary Date: Thu, 8 Aug 2024 17:57:40 +0300 Subject: [PATCH 09/20] finalize tests --- lambda/app.py | 4 ++-- lambda/tests/test_app.py | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lambda/app.py b/lambda/app.py index b187889..5a9c59a 100644 --- a/lambda/app.py +++ b/lambda/app.py @@ -1,5 +1,5 @@ import boto3 -from numbers import Number +import numpy as np from datetime import datetime, timezone from pyiceberg.catalog.glue import GlueCatalog from pyiceberg.table import Table @@ -52,7 +52,7 @@ def send_custom_metric( metric_name, dimensions, value, unit, namespace, timesta def send_metrics(metrics: dict, namespace: str, table: Table, snapshot: Snapshot): for metric_name, metric_value in metrics.items(): - if not isinstance(metric_value, Number): + if isinstance(metric_value, np.int64) or isinstance(metric_value, np.float64): metric_value = metric_value.item() logger.info(f"metric_name={namespace}.{metric_name}, metric_value={metric_value}") send_custom_metric( diff --git a/lambda/tests/test_app.py b/lambda/tests/test_app.py index 64415d1..feb35e1 100644 --- a/lambda/tests/test_app.py +++ b/lambda/tests/test_app.py @@ -65,7 +65,7 @@ def create_arrow_table(self, range_start, range_end): def assert_metrics(self, expected, table, snapshot, method_to_test): def send_metrics_stub(metrics, namespace, table, snapshot): - metrics = {k: v.item() if not isinstance(v, Number) else v for k, v in metrics.items()} + metrics = {k: v.item() if isinstance(v, np.int64) or isinstance(v, np.float64) else v for k, v in metrics.items()} self.assertDictEqual(metrics, expected) with patch('app.send_metrics', side_effect=send_metrics_stub): @@ -73,13 +73,13 @@ def send_metrics_stub(metrics, namespace, table, snapshot): def test_send_files_metrics(self): - expected_file_metrics = {'avg_record_count': np.int64(1), 'max_record_count': np.int64(1), 'min_record_count': np.int64(1), 'avg_file_size': np.int64(1068), 'max_file_size': np.int64(1068), 'min_file_size': np.int64(1068)} + expected_file_metrics = {'avg_record_count': 1, 'max_record_count': 1, 'min_record_count': 1, 'avg_file_size': 1068, 'max_file_size': 1068, 'min_file_size': 1068} self.assert_metrics(expected_file_metrics, self.table, self.snapshot, send_files_metrics) @patch('app.send_custom_metric') def test_send_partition_metrics(self, mock_send_custom_metric): - expected_partition_metrics = {'avg_record_count': np.int64(1), 'max_record_count': np.int64(1), 'min_record_count': np.int64(1), 'deviation_record_count': np.float64(0.0), 'skew_record_count': np.float64(0.0), 'avg_file_count': np.int64(1), 'max_file_count': np.int64(1), 'min_file_count': np.int64(1), 'deviation_file_count': np.float64(0.0), 'skew_file_count': np.float64(0.0)} + expected_partition_metrics = {'avg_record_count': 1, 'max_record_count': 1, 'min_record_count': 1, 'deviation_record_count': 0.0, 'skew_record_count': 0.0, 'avg_file_count': 1, 'max_file_count': 1, 'min_file_count': 1, 'deviation_file_count': 0.0, 'skew_file_count': 0.0} self.assert_metrics(expected_partition_metrics, self.table, self.snapshot, send_partition_metrics) @@ -100,10 +100,10 @@ def update_table(self, range_start, range_end): def test_metrics_after_update(self, mock_send_custom_metric): self.update_table(5, 10) - expected_file_metrics = {'avg_record_count': np.int64(1), 'max_record_count': np.int64(1), 'min_record_count': np.int64(1), 'avg_file_size': np.int64(1068), 'max_file_size': np.int64(1068), 'min_file_size': np.int64(1068)} + expected_file_metrics = {'avg_record_count': 1, 'max_record_count': 1, 'min_record_count': 1, 'avg_file_size': 1068, 'max_file_size': 1068, 'min_file_size': 1068} self.assert_metrics(expected_file_metrics, self.table, self.snapshot, send_files_metrics) - expected_partition_metrics = {'avg_record_count': np.int64(1), 'max_record_count': np.int64(1), 'min_record_count': np.int64(1), 'deviation_record_count': np.float64(0.0), 'skew_record_count': np.float64(0.0), 'avg_file_count': np.int64(1), 'max_file_count': np.int64(1), 'min_file_count': np.int64(1), 'deviation_file_count': np.float64(0.0), 'skew_file_count': np.float64(0.0)} + expected_partition_metrics = {'avg_record_count': 1, 'max_record_count': 1, 'min_record_count': 1, 'deviation_record_count': 0.0, 'skew_record_count': 0.0, 'avg_file_count': 1, 'max_file_count': 1, 'min_file_count': 1, 'deviation_file_count': 0.0, 'skew_file_count': 0.0} self.assert_metrics(expected_partition_metrics, self.table, self.snapshot, send_partition_metrics) expected_snapshot_metrics = {'added_data_files': 5, 'added_records': 5, 'changed_partition_count': 5, 'total_records': 10, 'total_data_files': 10, 'total_delete_files': 0, 'added_files_size': 5340, 'total_files_size': 10680, 'added_position_deletes': 0} From bd480e1ad69f567aa2df313c49da207e91b132ee Mon Sep 17 00:00:00 2001 From: itakserman-cloudinary Date: Sun, 11 Aug 2024 09:09:05 +0300 Subject: [PATCH 10/20] linting --- lambda/app.py | 12 ++++++++---- lambda/tests/test_app.py | 6 +++--- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/lambda/app.py b/lambda/app.py index 5a9c59a..130422d 100644 --- a/lambda/app.py +++ b/lambda/app.py @@ -49,11 +49,15 @@ def send_custom_metric( metric_name, dimensions, value, unit, namespace, timesta Namespace=namespace, MetricData=[metric_data] ) - + +def normalize_metrics(metrics: dict): + return {k: v.item() if isinstance(v, np.int64) or isinstance(v, np.float64) + else v + for k, v in metrics.items()} + def send_metrics(metrics: dict, namespace: str, table: Table, snapshot: Snapshot): - for metric_name, metric_value in metrics.items(): - if isinstance(metric_value, np.int64) or isinstance(metric_value, np.float64): - metric_value = metric_value.item() + normalized_metrics = normalize_metrics(metrics) + for metric_name, metric_value in normalized_metrics.items(): logger.info(f"metric_name={namespace}.{metric_name}, metric_value={metric_value}") send_custom_metric( metric_name=f"{namespace}.{metric_name}", diff --git a/lambda/tests/test_app.py b/lambda/tests/test_app.py index feb35e1..750b9db 100644 --- a/lambda/tests/test_app.py +++ b/lambda/tests/test_app.py @@ -9,7 +9,7 @@ from pyiceberg.catalog.sql import SqlCatalog import numpy as np import pyarrow as pa -from app import send_files_metrics, send_partition_metrics, send_snapshot_metrics +from app import send_files_metrics, send_partition_metrics, send_snapshot_metrics, normalize_metrics # Mock AWS credentials os.environ['AWS_ACCESS_KEY_ID'] = 'testing' @@ -65,8 +65,8 @@ def create_arrow_table(self, range_start, range_end): def assert_metrics(self, expected, table, snapshot, method_to_test): def send_metrics_stub(metrics, namespace, table, snapshot): - metrics = {k: v.item() if isinstance(v, np.int64) or isinstance(v, np.float64) else v for k, v in metrics.items()} - self.assertDictEqual(metrics, expected) + normalized_metrics = normalize_metrics(metrics) + self.assertDictEqual(normalized_metrics, expected) with patch('app.send_metrics', side_effect=send_metrics_stub): method_to_test(table, snapshot) From e2d7d9ddc0bd3cc81ade25764a9b4d061f90bde4 Mon Sep 17 00:00:00 2001 From: itakserman-cloudinary Date: Tue, 13 Aug 2024 09:30:53 +0300 Subject: [PATCH 11/20] Support partition of complex types and multiple columns --- lambda/app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lambda/app.py b/lambda/app.py index 130422d..098c243 100644 --- a/lambda/app.py +++ b/lambda/app.py @@ -113,7 +113,7 @@ def send_partition_metrics(table: Table, snapshot: Snapshot): send_metrics(partition_metrics, "partitions", table, snapshot) for index, row in df.iterrows(): - partition_name = row['partition'] + partition_name = "_".join(f"{val}" for val in row['partition'].values()) record_count = row['record_count'] file_count = row['file_count'] logger.info(f"partition_name={partition_name}, record_count={record_count}, file_count={file_count}") From e118a221908630351d09ceefbaba65afaccb2ceb Mon Sep 17 00:00:00 2001 From: itakserman-cloudinary Date: Thu, 15 Aug 2024 11:31:12 +0300 Subject: [PATCH 12/20] Repalce readme arch diagram --- assets/arch.png | Bin 116229 -> 145207 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/arch.png b/assets/arch.png index 9bfe91f2e4424623fceee4750b679bfb9fecfe2f..816d57e6b5f89924358d64b8a12e98b9cf07b777 100644 GIT binary patch literal 145207 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 z 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

48b^&5H)`3Vs)(~ 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 ZkSEM))J`d7-Z Date: Sun, 18 Aug 2024 07:46:59 +0300 Subject: [PATCH 13/20] gitignore --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 86c9cd7..1b1b67d 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,6 @@ samconfig.toml .env.local.json events/my.event.json lambda/tests/.pytest_cache -lambda/tests/test_db \ No newline at end of file +lambda/tests/test_db +lambda/tests/__pycache__ +lambda/__pycache__ \ No newline at end of file From a14126cb3662e66a48765bcb206493c0f8e67c85 Mon Sep 17 00:00:00 2001 From: itakserman-cloudinary Date: Sun, 18 Aug 2024 11:40:36 +0300 Subject: [PATCH 14/20] Add deploy from ECR --- README.md | 16 ++++++++++------ lambda/Dockerfile | 12 ++++++++++++ template.yaml => lambda/template.yaml | 13 +++++-------- 3 files changed, 27 insertions(+), 14 deletions(-) create mode 100644 lambda/Dockerfile rename template.yaml => lambda/template.yaml (84%) diff --git a/README.md b/README.md index 03ff4a1..d5e35b9 100644 --- a/README.md +++ b/README.md @@ -89,7 +89,7 @@ https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/i ### Build and Deploy -> ! Important - The guidance below uses AWS Serverless Application Model (SAM) for easier packaging and deployment of AWS Lambda. However if you use your own packaging tool or if you want to deploy AWS Lambda manually you can explore following files: +> ! Important - The guidance below uses AWS Serverless Application Model (SAM) and Amazon ECR for easier packaging and deployment of AWS Lambda. However if you use your own packaging tool or if you want to deploy AWS Lambda manually you can explore following files: > - template.yaml > - lambda/requirements.txt > - lambda/app.py @@ -99,22 +99,26 @@ https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/i Once you've installed [Docker](#install-docker) and [SAM CLI](#install-sam-cli) you are ready to build the AWS Lambda. Open your terminal and run command below. ```bash +cd lambda +docker build -f Dockerfile --platform linux/amd64 -t iceberg-monitoring:main --build-arg CLOUDWATCH_NAMESPACE={{ cw_namespace }} . sam build --use-container ``` -#### 2. Deploy AWS Lambda using AWS SAM CLI +#### 2. Deploy AWS Lambda using AWS SAM CLI and Amazon ECR -Once build is finished you can deploy your AWS Lambda. SAM will upload packaged code and deploy AWS Lambda resource using AWS CloudFormation. Run below command using your terminal. +Once build is finished you can deploy your AWS Lambda. ECR will upload packaged code and SAM will deploy AWS Lambda resource using AWS CloudFormation. Run below command using your terminal. ```bash +aws ecr get-login-password --region {{ aws_region }} | docker login --username AWS --password-stdin {{ aws_account_id }}.dkr.ecr.us-east-1.amazonaws.com +aws ecr create-repository --repository-name iceberg-monitoring --region {{ aws_region }} --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE +docker tag iceberg-monitoring:main {{ ecr_repository_uri }}:latest +docker push {{ aws_account_id }}.dkr.ecr.{{ aws_region }}.amazonaws.com/iceberg-monitoring:latest sam deploy --guided ``` ##### Parameters -- `CWNamespace` - A namespace is a container for CloudWatch metrics. -- `GlueServiceRole` - AWS Glue Role arn you created [earlier](#configuring-iam-permissions-for-aws-glue). -- `Warehouse` - Required catalog property to determine the root path of the data warehouse on S3. This can be any path on your S3 bucket. Not critical for the solution. +- `CW_NAMESPACE` - A namespace is a container for CloudWatch metrics. #### 3. Configure EventBridge Trigger diff --git a/lambda/Dockerfile b/lambda/Dockerfile new file mode 100644 index 0000000..cd1b3ee --- /dev/null +++ b/lambda/Dockerfile @@ -0,0 +1,12 @@ + FROM public.ecr.aws/lambda/python:3.10 AS prod + +COPY . ${LAMBDA_TASK_ROOT} + +# Install the function's dependencies +RUN pip install --upgrade pip && \ + pip install -r requirements.txt + +ARG CLOUDWATCH_NAMESPACE +ENV CW_NAMESPACE=$CLOUDWATCH_NAMESPACE + +CMD [ "app.lambda_handler" ] \ No newline at end of file diff --git a/template.yaml b/lambda/template.yaml similarity index 84% rename from template.yaml rename to lambda/template.yaml index 9399e9a..42855f8 100644 --- a/template.yaml +++ b/lambda/template.yaml @@ -1,8 +1,7 @@ AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Parameters: - CWNamespace: - Description: Amazon CloudWatch custom metric namespace + ImageURL: Type: String Globals: Function: @@ -12,13 +11,14 @@ Resources: IcebergMetricsLambda: Type: AWS::Serverless::Function Properties: - CodeUri: lambda/ - Handler: app.lambda_handler - Runtime: python3.9 + PackageType: Image + ImageUri: !Ref ImageURL Policies: - CloudWatchPutMetricPolicy: {} - AWSLambdaBasicExecutionRole - AmazonS3ReadOnlyAccess + - ECR-Pull-Read-Only + - AmazonEC2ContainerRegistryReadOnly - Statement: - Sid: GlueDataCatalogPolicy Effect: Allow @@ -35,9 +35,6 @@ Resources: Resource: '*' Architectures: - x86_64 - Environment: - Variables: - CW_NAMESPACE: !Ref CWNamespace PermissionForEventBridgeToInvokeLambda: Type: AWS::Lambda::Permission Properties: From f9fce1a0930e250fc9422c47c7885fbabd2656fe Mon Sep 17 00:00:00 2001 From: itakserman-cloudinary Date: Sun, 18 Aug 2024 11:59:54 +0300 Subject: [PATCH 15/20] Add deploy from ECR --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d5e35b9..2a40e4f 100644 --- a/README.md +++ b/README.md @@ -113,12 +113,17 @@ aws ecr get-login-password --region {{ aws_region }} | docker login --username A aws ecr create-repository --repository-name iceberg-monitoring --region {{ aws_region }} --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE docker tag iceberg-monitoring:main {{ ecr_repository_uri }}:latest docker push {{ aws_account_id }}.dkr.ecr.{{ aws_region }}.amazonaws.com/iceberg-monitoring:latest -sam deploy --guided +sam deploy --debug --region {{ aws_region }} \ + --parameter-overrides ImageURL={{ aws_account_id }}.dkr.ecr.{{ aws_region }}.amazonaws.com/iceberg-monitoring:latest \ + --image-repository {{ aws_account_id }}.dkr.ecr.{{ aws_region }}.amazonaws.com/iceberg-monitoring \ + --stack-name iceberg-monitoring --capabilities CAPABILITY_IAM CAPABILITY_AUTO_EXPAND \ + --s3-bucket {{ s3_bucket }} --s3-prefix iceberg-monitoring ``` ##### Parameters - `CW_NAMESPACE` - A namespace is a container for CloudWatch metrics. +- `ImageURL` - The #### 3. Configure EventBridge Trigger From e3f9772363b1c2383a56766a77ef59a3a55215d1 Mon Sep 17 00:00:00 2001 From: itakserman-cloudinary Date: Sun, 18 Aug 2024 12:01:34 +0300 Subject: [PATCH 16/20] Add deploy from ECR --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 2a40e4f..b574829 100644 --- a/README.md +++ b/README.md @@ -123,7 +123,6 @@ sam deploy --debug --region {{ aws_region }} \ ##### Parameters - `CW_NAMESPACE` - A namespace is a container for CloudWatch metrics. -- `ImageURL` - The #### 3. Configure EventBridge Trigger From a0c2075365fda62409b7f885d3fc0262e6420096 Mon Sep 17 00:00:00 2001 From: itakserman-cloudinary Date: Sun, 18 Aug 2024 12:04:04 +0300 Subject: [PATCH 17/20] Add deploy from ECR --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b574829..c377884 100644 --- a/README.md +++ b/README.md @@ -122,7 +122,7 @@ sam deploy --debug --region {{ aws_region }} \ ##### Parameters -- `CW_NAMESPACE` - A namespace is a container for CloudWatch metrics. +- `CLOUDWATCH_NAMESPACE` - A namespace is a container for CloudWatch metrics. #### 3. Configure EventBridge Trigger From 8bd7f9307c6155ae9182cc1f16b04e8eabbbd567 Mon Sep 17 00:00:00 2001 From: itakserman-cloudinary Date: Sun, 18 Aug 2024 12:15:48 +0300 Subject: [PATCH 18/20] Add deploy from ECR --- lambda/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lambda/Dockerfile b/lambda/Dockerfile index cd1b3ee..1432af8 100644 --- a/lambda/Dockerfile +++ b/lambda/Dockerfile @@ -1,4 +1,4 @@ - FROM public.ecr.aws/lambda/python:3.10 AS prod +FROM public.ecr.aws/lambda/python:3.10 COPY . ${LAMBDA_TASK_ROOT} From d02e9bf5cdb724190bbf562c3402255f89527c9a Mon Sep 17 00:00:00 2001 From: itakserman-cloudinary Date: Sun, 1 Sep 2024 09:36:38 +0300 Subject: [PATCH 19/20] pr comments --- README.md | 48 ++++++++++++++++++++++---------------------- lambda/app.py | 2 -- lambda/template.yaml | 1 - 3 files changed, 24 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index c377884..154e2e1 100644 --- a/README.md +++ b/README.md @@ -93,39 +93,39 @@ https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/i > - template.yaml > - lambda/requirements.txt > - lambda/app.py +> Once you've installed [Docker](#install-docker) and [SAM CLI](#install-sam-cli) you are ready to build the AWS Lambda. Open your terminal and run command below. -#### 1. Build AWS Lambda using AWS SAM CLI - -Once you've installed [Docker](#install-docker) and [SAM CLI](#install-sam-cli) you are ready to build the AWS Lambda. Open your terminal and run command below. +#### 1. Build and Deploy Script ```bash -cd lambda -docker build -f Dockerfile --platform linux/amd64 -t iceberg-monitoring:main --build-arg CLOUDWATCH_NAMESPACE={{ cw_namespace }} . +export CLOUDWATCH_NAMESPACE={{ cw_namespace }} +export AWS_REGION={{ aws_region }} +export aws_account_id={{ aws_account_id }} +export ecr_repository_name={{ repository_name }} +export STACK_NAME={{ your_stack_name }} +export S3_ARTIFACTS_BUCKET_NAME={{ s3_bucket_name }} +export S3_ARTIFACTS_PATH={{ s3_bucket_path }} +export ecr_repository_uri=${aws_account_id}.dkr.ecr.$AWS_REGION.amazonaws.com/${ecr_repository_name} + +docker build -f Dockerfile --platform linux/amd64 -t ${ecr_repository_name}:main --build-arg CLOUDWATCH_NAMESPACE=$CLOUDWATCH_NAMESPACE . sam build --use-container -``` - -#### 2. Deploy AWS Lambda using AWS SAM CLI and Amazon ECR - -Once build is finished you can deploy your AWS Lambda. ECR will upload packaged code and SAM will deploy AWS Lambda resource using AWS CloudFormation. Run below command using your terminal. - -```bash -aws ecr get-login-password --region {{ aws_region }} | docker login --username AWS --password-stdin {{ aws_account_id }}.dkr.ecr.us-east-1.amazonaws.com -aws ecr create-repository --repository-name iceberg-monitoring --region {{ aws_region }} --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE -docker tag iceberg-monitoring:main {{ ecr_repository_uri }}:latest -docker push {{ aws_account_id }}.dkr.ecr.{{ aws_region }}.amazonaws.com/iceberg-monitoring:latest -sam deploy --debug --region {{ aws_region }} \ - --parameter-overrides ImageURL={{ aws_account_id }}.dkr.ecr.{{ aws_region }}.amazonaws.com/iceberg-monitoring:latest \ - --image-repository {{ aws_account_id }}.dkr.ecr.{{ aws_region }}.amazonaws.com/iceberg-monitoring \ - --stack-name iceberg-monitoring --capabilities CAPABILITY_IAM CAPABILITY_AUTO_EXPAND \ - --s3-bucket {{ s3_bucket }} --s3-prefix iceberg-monitoring +aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin ${aws_account_id}.dkr.ecr.us-east-1.amazonaws.com +aws ecr create-repository --repository-name $ecr_repository_name --region $AWS_REGION --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE +docker tag ${ecr_repository_name}:main ${ecr_repository_uri}:latest +docker push ${ecr_repository_uri}:latest + +sam deploy --guided --debug --region $AWS_REGION \ + --parameter-overrides ImageURL=${ecr_repository_uri}:latest \ + --image-repository $ecr_repository_uri \ + --stack-name $STACK_NAME --capabilities CAPABILITY_IAM CAPABILITY_AUTO_EXPAND \ + --s3-bucket $S3_ARTIFACTS_BUCKET_NAME --s3-prefix $S3_ARTIFACTS_PATH ``` ##### Parameters - `CLOUDWATCH_NAMESPACE` - A namespace is a container for CloudWatch metrics. - -#### 3. Configure EventBridge Trigger +#### 2. Configure EventBridge Trigger In this section you will configure EventBridge Rule that will trigger Lambda function on every transaction commit to Apache Iceberg table. Default rule listens to `Glue Data Catalog Table State Change` event from all the tables in Glue Data Catalog catalog. Lambda code knows to skip non-iceberg tables. @@ -175,7 +175,7 @@ events_client.put_targets( print(f"Pattern updated = {event_pattern_dump}") ``` -#### 4. (Optional) Create CloudWatch Dashboard +#### 3. (Optional) Create CloudWatch Dashboard Once your Iceberg Table metrics are submitted to CloudWatch you can start using them to monitor and create alarms. CloudWatch also let you visualize metrics using CloudWatch Dashboards. `assets/cloudwatch-dashboard.template.json` is a sample CloudWatch dashboard configuration that uses fraction of the submitted metrics and combines it with AWS Glue native metrics for Apache Iceberg. diff --git a/lambda/app.py b/lambda/app.py index 098c243..64add29 100644 --- a/lambda/app.py +++ b/lambda/app.py @@ -194,8 +194,6 @@ def lambda_handler(event, context): catalog = GlueCatalog(glue_db_name) table = catalog.load_table((glue_db_name, glue_table_name)) snapshot = table.current_snapshot() - logger.info(f"current snapshot id={snapshot.snapshot_id}") - logger.info("Using glue IS to produce metrics") send_snapshot_metrics(table, snapshot) send_partition_metrics(table, snapshot) diff --git a/lambda/template.yaml b/lambda/template.yaml index 42855f8..bebabc1 100644 --- a/lambda/template.yaml +++ b/lambda/template.yaml @@ -17,7 +17,6 @@ Resources: - CloudWatchPutMetricPolicy: {} - AWSLambdaBasicExecutionRole - AmazonS3ReadOnlyAccess - - ECR-Pull-Read-Only - AmazonEC2ContainerRegistryReadOnly - Statement: - Sid: GlueDataCatalogPolicy From fedb2f389d67f1f53f6eed947573cb55f59fb957 Mon Sep 17 00:00:00 2001 From: itakserman-cloudinary Date: Sun, 1 Sep 2024 09:48:54 +0300 Subject: [PATCH 20/20] pr comments --- lambda/template.yaml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lambda/template.yaml b/lambda/template.yaml index bebabc1..fde2733 100644 --- a/lambda/template.yaml +++ b/lambda/template.yaml @@ -32,6 +32,14 @@ Resources: - glue:GetPartitions - glue:ListSessions Resource: '*' + - Statement: + - Sid: ECRReadOnlyAdditionsPolicy + Effect: Allow + Action: + - ecr:DescribeRegistry + - ecr:InitiateLayerUpload + - ecr:SetRepositoryPolicy + Resource: '*' Architectures: - x86_64 PermissionForEventBridgeToInvokeLambda: