Add logging

This commit is contained in:
Justin Edmund 2025-01-18 11:46:00 -08:00
parent 5355f57a64
commit e642d382b8
3 changed files with 57 additions and 19 deletions

View file

@ -12,9 +12,7 @@ class GeneratePartyPreviewJob < ApplicationJob
around_perform :track_timing around_perform :track_timing
def perform(party_id) def perform(party_id)
# Log start of job processing
Rails.logger.info("Starting preview generation for party #{party_id}") Rails.logger.info("Starting preview generation for party #{party_id}")
party = Party.find(party_id) party = Party.find(party_id)
if party.preview_state == 'generated' && if party.preview_state == 'generated' &&
@ -26,7 +24,10 @@ class GeneratePartyPreviewJob < ApplicationJob
begin begin
service = PreviewService::Coordinator.new(party) service = PreviewService::Coordinator.new(party)
Rails.logger.info("Created PreviewService::Coordinator")
result = service.generate_preview result = service.generate_preview
Rails.logger.info("Generate preview result: #{result}")
if result if result
Rails.logger.info("Successfully generated preview for party #{party_id}") Rails.logger.info("Successfully generated preview for party #{party_id}")
@ -36,9 +37,10 @@ class GeneratePartyPreviewJob < ApplicationJob
end end
rescue => e rescue => e
Rails.logger.error("Error generating preview for party #{party_id}: #{e.message}") Rails.logger.error("Error generating preview for party #{party_id}: #{e.message}")
Rails.logger.error(e.backtrace.join("\n")) Rails.logger.error("Full error details:")
Rails.logger.error(e.full_message) # This will include the stack trace
notify_failure(party, e) notify_failure(party, e)
raise # Allow retry mechanism to handle the error raise
end end
end end

View file

@ -15,12 +15,24 @@ module PreviewService
end end
def create_blank_canvas(width: PREVIEW_WIDTH, height: PREVIEW_HEIGHT, color: DEFAULT_BACKGROUND_COLOR) def create_blank_canvas(width: PREVIEW_WIDTH, height: PREVIEW_HEIGHT, color: DEFAULT_BACKGROUND_COLOR)
temp_file = Tempfile.new(%w[canvas .png]) Rails.logger.info("Checking ImageMagick installation...")
version = `convert -version`
Rails.logger.info("ImageMagick version: #{version}")
MiniMagick::Tool::Convert.new do |convert| temp_file = Tempfile.new(%w[canvas .png])
convert.size "#{width}x#{height}" Rails.logger.info("Created temp file: #{temp_file.path}")
convert << "xc:#{color}"
convert << temp_file.path begin
MiniMagick::Tool::Convert.new do |convert|
convert.size "#{width}x#{height}"
convert << "xc:#{color}"
convert << temp_file.path
end
Rails.logger.info("Canvas created successfully")
rescue => e
Rails.logger.error("Failed to create canvas: #{e.message}")
Rails.logger.error(e.backtrace.join("\n"))
raise
end end
temp_file temp_file

View file

@ -41,22 +41,33 @@ module PreviewService
Rails.logger.info("Starting preview generation for party #{@party.id}") Rails.logger.info("Starting preview generation for party #{@party.id}")
set_generation_in_progress set_generation_in_progress
# Generate the preview image Rails.logger.info("Creating preview image...")
image = create_preview_image image = create_preview_image
save_preview(image) Rails.logger.info("Preview image created successfully")
# Update party state Rails.logger.info("Saving preview...")
save_preview(image)
Rails.logger.info("Preview saved successfully")
Rails.logger.info("Updating party state...")
@party.update!( @party.update!(
preview_state: :generated, preview_state: :generated,
preview_generated_at: Time.current preview_generated_at: Time.current
) )
Rails.logger.info("Party state updated successfully")
true true
rescue => e rescue => e
Rails.logger.error("Failed to generate preview: #{e.class} - #{e.message}")
Rails.logger.error("Stack trace:")
Rails.logger.error(e.backtrace.join("\n"))
handle_preview_generation_error(e) handle_preview_generation_error(e)
false false
ensure ensure
Rails.logger.info("Cleaning up resources...")
@image_fetcher.cleanup @image_fetcher.cleanup
clear_generation_in_progress clear_generation_in_progress
Rails.logger.info("Cleanup completed")
end end
end end
@ -99,28 +110,34 @@ module PreviewService
# #
# @return [MiniMagick::Image] The generated preview image # @return [MiniMagick::Image] The generated preview image
def create_preview_image def create_preview_image
# Create blank canvas Rails.logger.info("Creating blank canvas...")
canvas = @canvas_service.create_blank_canvas canvas = @canvas_service.create_blank_canvas
image = MiniMagick::Image.new(canvas.path) image = MiniMagick::Image.new(canvas.path)
Rails.logger.info("Blank canvas created")
# Fetch job icon Rails.logger.info("Processing job icon...")
job_icon = nil job_icon = nil
if @party.job.present? if @party.job.present?
Rails.logger.info("Fetching job icon for job ID: #{@party.job.granblue_id}")
job_icon = @image_fetcher.fetch_job_icon(@party.job.granblue_id) job_icon = @image_fetcher.fetch_job_icon(@party.job.granblue_id)
Rails.logger.info("Job icon fetched successfully") if job_icon
end end
# Add party name with job icon Rails.logger.info("Adding party name and job icon...")
text_result = @canvas_service.add_text(image, @party.name, job_icon: job_icon, user: @party.user) text_result = @canvas_service.add_text(image, @party.name, job_icon: job_icon, user: @party.user)
image = text_result[:image] image = text_result[:image]
Rails.logger.info("Party name and job icon added")
# Calculate grid layout Rails.logger.info("Calculating grid layout...")
grid_layout = @grid_service.calculate_layout( grid_layout = @grid_service.calculate_layout(
canvas_height: Canvas::PREVIEW_HEIGHT, canvas_height: Canvas::PREVIEW_HEIGHT,
title_bottom_y: text_result[:text_bottom_y] title_bottom_y: text_result[:text_bottom_y]
) )
Rails.logger.info("Grid layout calculated")
# Organize and draw weapons Rails.logger.info("Drawing weapons...")
image = organize_and_draw_weapons(image, grid_layout) image = organize_and_draw_weapons(image, grid_layout)
Rails.logger.info("Weapons drawn successfully")
image image
end end
@ -196,15 +213,22 @@ module PreviewService
begin begin
image.write(temp_file.path) image.write(temp_file.path)
# Use timestamped filename similar to local storage
timestamp = Time.current.strftime('%Y%m%d%H%M%S')
key = "#{PREVIEW_FOLDER}/#{@party.shortcode}_#{timestamp}.png"
File.open(temp_file.path, 'rb') do |file| File.open(temp_file.path, 'rb') do |file|
@aws_service.s3_client.put_object( @aws_service.s3_client.put_object(
bucket: S3_BUCKET, bucket: @aws_service.bucket,
key: preview_key, key: key,
body: file, body: file,
content_type: 'image/png', content_type: 'image/png',
acl: 'private' acl: 'private'
) )
end end
# Optionally, store this key on the party record if needed for retrieval
@party.update!(preview_s3_key: key)
ensure ensure
temp_file.close temp_file.close
temp_file.unlink temp_file.unlink