ai-infrastructure/terraform-modules/metrics-tracking/main.tf (178 lines of code) (raw):

# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. data "google_project" "project" { project_id = var.project_id } locals { message_schema = "syntax = \"proto3\";\n\nmessage Metrics {\n string test_id=1;\n string request_type = 2;\n string request_name=3;\n int32 response_length=4;\n float response_time=5;\n string start_time=6;\n string exception=7;\n optional string request=8;\n optional string response=9;\n optional string model_name=10;\n optional string model_method=11;\n optional string tokenizer=12;\n optional int32 num_output_tokens=13;\n optional int32 num_input_tokens=14;\n optional int32 model_response_time=15;\n}" table_schema = <<EOF [ { "name": "subscription_name", "type": "STRING", "mode": "NULLABLE", "description": "Subscription name" }, { "name": "message_id", "type": "STRING", "mode": "NULLABLE", "description": "Test ID" }, { "name": "publish_time", "type": "TIMESTAMP", "mode": "NULLABLE", "description": "Test ID" }, { "name": "attributes", "type": "JSON", "mode": "NULLABLE", "description": "Message attributes" }, { "name": "test_id", "type": "STRING", "mode": "NULLABLE", "description": "Test ID" }, { "name": "request_type", "type": "STRING", "mode": "NULLABLE", "description": "Request type" }, { "name": "request_name", "type": "STRING", "mode": "NULLABLE", "description": "Request name" }, { "name": "response_length", "type": "INT64", "mode": "NULLABLE", "description": "Response length" }, { "name": "response_time", "type": "FLOAT64", "mode": "NULLABLE", "description": "Response time in miliseconds" }, { "name": "start_time", "type": "DATETIME", "mode": "NULLABLE", "description": "Response time" }, { "name": "exception", "type": "STRING", "mode": "NULLABLE", "description": "Exception encounterd during request processing if any" }, { "name": "request", "type": "JSON", "mode": "NULLABLE", "description": "Request body" }, { "name": "response", "type": "JSON", "mode": "NULLABLE", "description": "Response body" }, { "name": "model_name", "type": "STRING", "mode": "NULLABLE", "description": "Model name" }, { "name": "model_method", "type": "STRING", "mode": "NULLABLE", "description": "Model method" }, { "name": "tokenizer", "type": "STRING", "mode": "NULLABLE", "description": "Tokenizer used by the model" }, { "name": "num_output_tokens", "type": "INT64", "mode": "NULLABLE", "description": "Number of output tokens" }, { "name": "num_input_tokens", "type": "INT64", "mode": "NULLABLE", "description": "Number of input tokens" }, { "name": "model_response_time", "type": "INT64", "mode": "NULLABLE", "description": "Response time from a model server" } ] EOF message_retention_time = "86600s" } resource "google_pubsub_topic" "performance_metrics_sink" { project = data.google_project.project.project_id name = var.pubsub_config.topic_name depends_on = [google_pubsub_schema.performance_metrics_schema] schema_settings { schema = "projects/${data.google_project.project.project_id}/schemas/${var.pubsub_config.schema_name}" encoding = "JSON" } message_retention_duration = local.message_retention_time } resource "google_pubsub_schema" "performance_metrics_schema" { project = data.google_project.project.project_id name = var.pubsub_config.schema_name type = "PROTOCOL_BUFFER" definition = local.message_schema } resource "google_bigquery_dataset" "performance_metrics_dataset" { project = data.google_project.project.project_id dataset_id = var.bq_config.dataset_name friendly_name = "Performance metrics" description = "Performance metrics" location = var.bq_config.location delete_contents_on_destroy = !var.deletion_protection } resource "google_bigquery_table" "performance_metrics_table" { project = data.google_project.project.project_id dataset_id = google_bigquery_dataset.performance_metrics_dataset.dataset_id table_id = var.bq_config.table_name schema = local.table_schema deletion_protection = var.deletion_protection } resource "google_pubsub_subscription" "performance_metrics_bq_subscription" { project = data.google_project.project.project_id name = var.pubsub_config.subscription_name topic = google_pubsub_topic.performance_metrics_sink.name bigquery_config { table = "${google_bigquery_table.performance_metrics_table.project}.${google_bigquery_table.performance_metrics_table.dataset_id}.${google_bigquery_table.performance_metrics_table.table_id}" use_topic_schema = true drop_unknown_fields = true write_metadata = true } depends_on = [google_project_iam_member.viewer, google_project_iam_member.editor] } resource "google_project_iam_member" "viewer" { project = data.google_project.project.project_id role = "roles/bigquery.metadataViewer" member = "serviceAccount:service-${data.google_project.project.number}@gcp-sa-pubsub.iam.gserviceaccount.com" } resource "google_project_iam_member" "editor" { project = data.google_project.project.project_id role = "roles/bigquery.dataEditor" member = "serviceAccount:service-${data.google_project.project.number}@gcp-sa-pubsub.iam.gserviceaccount.com" }