Я пытаюсь запросить таблицу DynamoDB, чтобы получить данные за текущий месяц или текущую неделю, в зависимости от примененного фильтра (data_type = ежемесячно или еженедельно). Однако я столкнулся с проблемой, когда мой запрос возвращает как ежемесячные, так и еженедельные данные, хотя я фильтрую только ежемесячные данные (или только еженедельные данные). Структура таблицы DynamoDB:
rate_id: сохраняет значение, например 2024-11-summary за ноябрь или 2024-11-week1 за первую неделю ноября.
тип: указывает, являются ли данные еженедельными или ежемесячными. Еженедельные данные содержат данные только за текущую неделю. Ежемесячные данные содержат данные за все месяцы текущего года до текущего месяца.
платформа: указывает платформа, например Generic_Data_DF.
Другие поля: различные поля, связанные с частотой и успехом развертывания. ставка.
Код функции Lambda:
Вот текущий код функции Lambda, который пытается фильтровать данные перед отправкой их в Grafana для мониторинга:< /p>
import boto3
from boto3.dynamodb.conditions import Key
import logging
import json
from datetime import datetime, timedelta
from decimal import Decimal
# Initialize DynamoDB resource using IAM role
dynamodb = boto3.resource('dynamodb', region_name='eu-west-1')
# Specify the table
table = dynamodb.Table('deployment-frequency-table')
def query_items_by_tenant(tenant):
response = table.scan(
FilterExpression=Key('tenant').eq(tenant),
ProjectionExpression='#st, platform',
ExpressionAttributeNames={
'#st': 'status'
}
)
return response['Items']
def query_items_by_platform(platform, data_type=None):
filter_expression = Key('platform').eq(platform)
if data_type:
filter_expression &= Key('type').eq(data_type)
response = table.scan(
FilterExpression=filter_expression
)
return response['Items']
def query_items_by_rate_id(rate_id, platform, data_type=None):
"""Query items by a specific rate_id."""
filter_expression = Key('rate_id').eq(rate_id) & Key('platform').eq(platform)
if data_type:
filter_expression &= Key('type').eq(data_type)
response = table.scan(
FilterExpression=filter_expression
)
return response['Items']
def query_items_current_month(platform, data_type=None):
"""Query items for the current month based on rate_id and type."""
# Get the current year and month in 'YYYY-MM' format
current_month = datetime.now().strftime('%Y-%m')
filter_expression = Key('rate_id').begins_with(current_month)
# Then filter by platform
filter_expression &= Key('platform').eq(platform)
# Filter by 'monthly' type if data_type is 'monthly'
if data_type == 'monthly':
filter_expression &= Key('type').eq('monthly')
# Scan the table for entries that match the current month and platform, and also check for 'monthly' type
response = table.scan(
FilterExpression=filter_expression
)
return response.get('Items', [])
def query_all_items():
"""Query all items from the table."""
response = table.scan()
return response.get('Items', [])
# Function to extract month and year from rate_id
def preprocess_rate_id(items):
for item in items:
raw_rate_id = item.get('rate_id', '')
# Extract Year and Month
year, month = raw_rate_id.split('-')[:2]
# Convert month number to short name
month_name = datetime.strptime(month, "%m").strftime("%b")
# Format as "MMM YYYY"
item['rate_id_pretty'] = f"{month_name} {year}"
return items
def decimal_default(obj):
if isinstance(obj, Decimal):
return float(obj)
raise TypeError
def lambda_handler(event, context):
logging.info(f"Received event: {event}")
platform = event.get("queryStringParameters", {}).get("platform", "Generic_Data_DF") # Allow platform as a query parameter
rate_id = event.get("queryStringParameters", {}).get("rate_id")
current_month = event.get("queryStringParameters", {}).get("current_month", "false").lower() == "true"
all_data = event.get("queryStringParameters", {}).get("all_data", "false").lower() == "true"
data_type = event.get("queryStringParameters", {}).get("type", None)
# Log the incoming parameters for debugging
logging.info(f"Platform: {platform}, Data Type: {data_type}, Rate ID: {rate_id}, Current Month: {current_month}, All Data: {all_data}")
# If the platform is Generic_Data_LTC, fetch all items for that platform
if platform == 'Generic_Data_LTC':
logging.info("Fetching all data for platform Generic_Data_LTC.")
items = query_items_by_platform('Generic_Data_LTC', data_type)
elif all_data:
logging.info("Fetching all data for all months.")
items = query_all_items()
elif current_month:
logging.info("Filtering by current month.")
items = query_items_current_month(platform, data_type)
elif rate_id:
logging.info(f"Filtering by rate_id: {rate_id}")
items = query_items_by_rate_id(rate_id, platform, data_type)
else:
logging.info(f"Filtering by default platform: {platform}")
items = query_items_by_platform(platform, data_type)
# Preprocess the items to add the pretty rate_id
items = preprocess_rate_id(items)
return {
'statusCode': 200,
'body': json.dumps(items, default=decimal_default)
}
if __name__ == "__main__":
# Query items by platform
platform = 'Generic_Data_LTC'
queried_items = query_items_by_platform(platform)
print(f"Items with platform {platform}:")
for item in queried_items:
print(json.dumps(item, default=decimal_default))
Ожидаемое поведение: извлекается только элементы для платформы Generic_Data_DF, где type=monthly для Ноябрь 2024 г. (например, 2024-11-summary).
Фактическое поведение : Запрос по-прежнему возвращает еженедельные данные за ноябрь 2024 г. (например, 2024-11-неделя1, 2024-11-неделя2), несмотря на фильтрацию по type=monthly.
Ожидаемое поведение: извлекается только элементы для платформы Generic_Data_DF, где type=weekly для Ноябрь 2024 г. (например, 11 неделя 2024 г. 1, 2 неделя 2024 г. 11 ).
Фактическое поведение: запрос по-прежнему возвращает месячные данные за ноябрь 2024 года (например, 2024-11-summary< /code>), несмотря на фильтрацию по типу=еженедельно.
Что я Пытаясь Достижение:
Когда для data_type установлено значение «ежемесячно», я хочу получить только < сильные>ежемесячные данные.
Когда для параметра data_type установлено значение еженедельно, мне нужны только для получения еженедельных данных.
В чем мне нужна помощь: Почему мой запрос по-прежнему возвращается еженедельно code> и ежемесячные данные, несмотря на применение фильтра типа?
Я пытаюсь запросить таблицу DynamoDB, чтобы получить данные за [b]текущий месяц[/b] или [b]текущую неделю[/b], в зависимости от примененного фильтра (data_type = ежемесячно или еженедельно). Однако я столкнулся с проблемой, когда мой запрос возвращает как [b]ежемесячные[/b], так и [b]еженедельные[/b] данные, хотя я фильтрую только ежемесячные данные (или только еженедельные данные). [b]Структура таблицы DynamoDB:[/b] [list] [*][b] rate_id[/b]: сохраняет значение, например 2024-11-summary за ноябрь или 2024-11-week1 за первую неделю ноября.
[*] [b]тип[/b]: указывает, являются ли данные еженедельными или ежемесячными. Еженедельные данные содержат данные только за текущую неделю. Ежемесячные данные содержат данные за все месяцы текущего года до текущего месяца.
[*][b]платформа[/b]: указывает платформа, например Generic_Data_DF.
[*][b]Другие поля[/b]: различные поля, связанные с частотой и успехом развертывания. ставка.
[/list] [b]Код функции Lambda:[/b] Вот текущий код функции Lambda, который пытается фильтровать данные перед отправкой их в Grafana для мониторинга:< /p> [code]import boto3 from boto3.dynamodb.conditions import Key import logging import json from datetime import datetime, timedelta from decimal import Decimal
# Initialize DynamoDB resource using IAM role dynamodb = boto3.resource('dynamodb', region_name='eu-west-1')
# Specify the table table = dynamodb.Table('deployment-frequency-table')
def query_items_by_rate_id(rate_id, platform, data_type=None): """Query items by a specific rate_id.""" filter_expression = Key('rate_id').eq(rate_id) & Key('platform').eq(platform) if data_type: filter_expression &= Key('type').eq(data_type) response = table.scan( FilterExpression=filter_expression ) return response['Items']
def query_items_current_month(platform, data_type=None): """Query items for the current month based on rate_id and type.""" # Get the current year and month in 'YYYY-MM' format current_month = datetime.now().strftime('%Y-%m')
# Then filter by platform filter_expression &= Key('platform').eq(platform)
# Filter by 'monthly' type if data_type is 'monthly' if data_type == 'monthly': filter_expression &= Key('type').eq('monthly')
# Scan the table for entries that match the current month and platform, and also check for 'monthly' type response = table.scan( FilterExpression=filter_expression )
return response.get('Items', [])
def query_all_items(): """Query all items from the table.""" response = table.scan() return response.get('Items', [])
# Function to extract month and year from rate_id def preprocess_rate_id(items): for item in items: raw_rate_id = item.get('rate_id', '') # Extract Year and Month year, month = raw_rate_id.split('-')[:2] # Convert month number to short name month_name = datetime.strptime(month, "%m").strftime("%b") # Format as "MMM YYYY" item['rate_id_pretty'] = f"{month_name} {year}" return items
def decimal_default(obj): if isinstance(obj, Decimal): return float(obj) raise TypeError
def lambda_handler(event, context): logging.info(f"Received event: {event}") platform = event.get("queryStringParameters", {}).get("platform", "Generic_Data_DF") # Allow platform as a query parameter rate_id = event.get("queryStringParameters", {}).get("rate_id") current_month = event.get("queryStringParameters", {}).get("current_month", "false").lower() == "true" all_data = event.get("queryStringParameters", {}).get("all_data", "false").lower() == "true" data_type = event.get("queryStringParameters", {}).get("type", None) # Log the incoming parameters for debugging logging.info(f"Platform: {platform}, Data Type: {data_type}, Rate ID: {rate_id}, Current Month: {current_month}, All Data: {all_data}")
# If the platform is Generic_Data_LTC, fetch all items for that platform if platform == 'Generic_Data_LTC': logging.info("Fetching all data for platform Generic_Data_LTC.") items = query_items_by_platform('Generic_Data_LTC', data_type) elif all_data: logging.info("Fetching all data for all months.") items = query_all_items() elif current_month: logging.info("Filtering by current month.") items = query_items_current_month(platform, data_type) elif rate_id: logging.info(f"Filtering by rate_id: {rate_id}") items = query_items_by_rate_id(rate_id, platform, data_type) else: logging.info(f"Filtering by default platform: {platform}") items = query_items_by_platform(platform, data_type)
# Preprocess the items to add the pretty rate_id items = preprocess_rate_id(items)
if __name__ == "__main__": # Query items by platform platform = 'Generic_Data_LTC' queried_items = query_items_by_platform(platform) print(f"Items with platform {platform}:") for item in queried_items: print(json.dumps(item, default=decimal_default)) [/code] В Grafana я передаю такие запросы, как: [code]https:///dora-visualize?current_month=true&platform=Generic_Data_DF&data_type=monthly [/code] [list] [*][b]Ожидаемое поведение:[/b] извлекается только элементы для платформы Generic_Data_DF, где type=monthly для [b]Ноябрь 2024 г.[/b] (например, 2024-11-summary).
[*][b]Фактическое поведение :[/b] Запрос по-прежнему возвращает [b]еженедельные[/b] данные за [b]ноябрь 2024 г.[/b] (например, 2024-11-неделя1, 2024-11-неделя2), несмотря на фильтрацию по type=monthly.
[/list] [b]Другой пример запроса:[/b]
Я передавая этот запрос: [code]https:///dora-visualize?platform=Generic_Data_DF&data_type=weekly [/code] [list] [*][b]Ожидаемое поведение:[/b] извлекается только элементы для платформы Generic_Data_DF, где type=weekly для [b]Ноябрь 2024 г.[/b] (например, 11 неделя 2024 г. 1, 2 неделя 2024 г. 11 ).
[*][b]Фактическое поведение:[/b] запрос по-прежнему возвращает [b]месячные[/b] данные за [b]ноябрь 2024 года[/b] (например, 2024-11-summary< /code>), несмотря на фильтрацию по типу=еженедельно.
[/list] [b]Что я Пытаясь Достижение:[/b] [list] [*]Когда для data_type установлено значение «ежемесячно», я хочу получить только < сильные>ежемесячные данные.
[*]Когда для параметра data_type установлено значение еженедельно, мне нужны только для получения [b]еженедельных[/b] данных.
[/list] [b]В чем мне нужна помощь[/b]: [b]Почему мой запрос по-прежнему возвращается еженедельно[/b] code> и ежемесячные данные, несмотря на применение фильтра типа?