66"""
77
88import json
9+ import sys
910from pathlib import Path
1011from typing import Any
1112import requests
1415from templates .test_integration_file_template import get_test_file_template
1516from templates .prompt_template import get_generate_with_reference_prompt
1617from metric_operations_generator import generate_smoke_operations_from_metrics
18+ from utils ._logger import logger
19+ import yaml
20+ import base64 # The content is base64-encoded per GitHub API
1721
1822# MCP SDK imports
1923try :
2024 from mcp .server import Server
2125 from mcp .types import Tool , TextContent , Resource
26+ from mcp .types import Prompt , PromptArgument
2227 import mcp .server .stdio
2328except ImportError :
24- print ("Error: MCP SDK not installed. Install with: pip install mcp" )
25- exit (1 )
29+ logger . error ("Error: MCP SDK not installed. Install with: pip install mcp" )
30+ sys . exit (1 )
2631
2732
2833def generate_test_file (
@@ -196,7 +201,7 @@ def generate_metrics_file(integration_name: str) -> str:
196201 "Accept" : "application/vnd.github+json" ,
197202 }
198203
199- response = requests .get (url , headers = headers )
204+ response = requests .get (url , headers = headers , timeout = 2 )
200205 response .raise_for_status ()
201206
202207 releases = response .json () # list[dict]
@@ -205,36 +210,32 @@ def generate_metrics_file(integration_name: str) -> str:
205210
206211 latest = releases [0 ]
207212
208- metaDataUrl = f"{ constants .GH_BASE_API } /contents/receiver/{ integration_name .lower ()} receiver/metadata.yaml?ref={ latest .get ('tag_name' )} "
213+ receiver_path = f"receiver/{ integration_name .lower ()} receiver/metadata.yaml"
214+ metadata_url = f"{ constants .GH_BASE_API } /contents/{ receiver_path } ?ref={ latest .get ('tag_name' )} "
209215
210- response = requests .get (metaDataUrl , headers = headers )
216+ response = requests .get (metadata_url , headers = headers , timeout = 2 )
211217 if response .status_code != 200 :
212218 return f"Failed to fetch metadata.yaml for { integration_name } ."
213219
214220 metadata_content = response .json ().get ("content" )
215221 if not metadata_content :
216222 return "No content found in metadata.yaml."
217223
218- # The content is base64-encoded per GitHub API
219- import base64
220-
221224 try :
222225 decoded_yaml = base64 .b64decode (metadata_content ).decode ("utf-8" )
223226 except Exception as e :
224227 return f"Error decoding metadata.yaml content: { e } "
225228
226229 # Parse YAML to get metrics info
227230 try :
228- import yaml
229-
230231 yaml_data = yaml .safe_load (decoded_yaml )
231232 except Exception as e :
232233 return f"Error parsing YAML: { e } "
233234
234235 metric_template = {}
235236 metrics_dict = yaml_data .get ("metrics" , {})
236237 for metric_name , metric_info in metrics_dict .items ():
237- metric_type = set (metric_info .keys ()) & METRIC_TYPES
238+ metric_type = set (metric_info .keys ()) & constants . METRIC_TYPES
238239 metric_template [metric_name ] = {
239240 "data_type" : metric_type .pop () if metric_type else None ,
240241 "description" : metric_info .get ("description" , "" ),
@@ -249,9 +250,8 @@ def generate_metrics_file(integration_name: str) -> str:
249250 return "There is already a metric file created. Please delete and try again"
250251 # Create the parent directory if it doesn't exist
251252 metric_file_path .parent .mkdir (parents = True , exist_ok = True )
252- f = open (metric_file_path , "x" )
253- f .write (result_json )
254- f .close ()
253+ with open (metric_file_path , "x" ) as file :
254+ file .write (result_json )
255255
256256 return metric_template
257257
@@ -299,7 +299,10 @@ async def list_tools() -> list[Tool]:
299299 },
300300 "feature_name" : {
301301 "type" : "string" ,
302- "description" : "Feature name for the @features decorator (optional, defaults to <integration>_receiver_metrics)" ,
302+ "description" : (
303+ "Feature name for the @features decorator "
304+ "(optional, defaults to <integration>_receiver_metrics)"
305+ ),
303306 },
304307 },
305308 "required" : ["integration_name" , "metrics_json_file" ],
@@ -351,7 +354,7 @@ async def list_resources() -> list[Resource]:
351354 if constants .MYSQL_TEST_PATH .exists ():
352355 resources .append (
353356 Resource (
354- uri = f"file://{ MYSQL_TEST_PATH } " ,
357+ uri = f"file://{ constants . MYSQL_TEST_PATH } " ,
355358 name = "MySQL Metrics Test (Reference)" ,
356359 description = "MySQL metrics test implementation following PostgreSQL patterns" ,
357360 mimeType = "text/x-python" ,
@@ -402,7 +405,6 @@ async def read_resource(uri: str) -> str:
402405@app .list_prompts ()
403406async def list_prompts ():
404407 """List available prompts."""
405- from mcp .types import Prompt , PromptArgument
406408
407409 return [
408410 Prompt (
0 commit comments