Как запросить DynamoDB с несколькими фильтрами (платформа, тип и тариф_ид), чтобы вернуть только ежемесячные/еженедельныPython

Программы на Python
Ответить
Anonymous
 Как запросить DynamoDB с несколькими фильтрами (платформа, тип и тариф_ид), чтобы вернуть только ежемесячные/еженедельны

Сообщение Anonymous »

Я пытаюсь запросить таблицу 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))
В Grafana я передаю такие запросы, как:

Код: Выделить всё

https:///dora-visualize?current_month=true&platform=Generic_Data_DF&data_type=monthly
  • Ожидаемое поведение: извлекается только элементы для платформы Generic_Data_DF, где type=monthly для Ноябрь 2024 г. (например, 2024-11-summary).
  • Фактическое поведение : Запрос по-прежнему возвращает еженедельные данные за ноябрь 2024 г. (например, 2024-11-неделя1, 2024-11-неделя2), несмотря на фильтрацию по type=monthly.
Другой пример запроса:

Я передавая этот запрос:

Код: Выделить всё

https:///dora-visualize?platform=Generic_Data_DF&data_type=weekly
  • Ожидаемое поведение: извлекается только элементы для платформы Generic_Data_DF, где type=weekly для Ноябрь 2024 г. (например, 11 неделя 2024 г. 1, 2 неделя 2024 г. 11 ).
  • Фактическое поведение: запрос по-прежнему возвращает месячные данные за ноябрь 2024 года (например, 2024-11-summary< /code>), несмотря на фильтрацию по типу=еженедельно.
Что я Пытаясь Достижение:
  • Когда для data_type установлено значение «ежемесячно», я хочу получить только < сильные>ежемесячные данные.
  • Когда для параметра data_type установлено значение еженедельно, мне нужны только для получения еженедельных данных.
В чем мне нужна помощь:
Почему мой запрос по-прежнему возвращается еженедельно code> и ежемесячные данные, несмотря на применение фильтра типа?

Подробнее здесь: https://stackoverflow.com/questions/792 ... -id-to-ret
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»