minio connection log

This commit is contained in:
Mazyar
2026-05-16 14:08:58 +03:30
parent 6701428b09
commit bcb345103f
5 changed files with 186 additions and 18 deletions
+58 -13
View File
@@ -184,10 +184,13 @@ func NewStorageClient(config *Config, log logger.Logger) (*StorageClient, error)
func (s *StorageClient) verifyConnection(ctx context.Context) error {
exists, err := s.client.BucketExists(ctx, s.config.MinioBucket)
if err != nil {
return fmt.Errorf("bucket exists check for %q: %w", s.config.MinioBucket, err)
return s.logMinIOFailuref("bucket_exists", err, nil, "bucket exists check for %q", s.config.MinioBucket)
}
if !exists {
return fmt.Errorf("%w: %q", ErrBucketNotFound, s.config.MinioBucket)
err := fmt.Errorf("%w: %q", ErrBucketNotFound, s.config.MinioBucket)
return s.logMinIOFailure("bucket_exists", err, map[string]interface{}{
"bucket": s.config.MinioBucket,
})
}
buckets, err := s.client.ListBuckets(ctx)
@@ -228,7 +231,11 @@ func (s *StorageClient) resolveNoticeStoragePrefix(ctx context.Context, contract
return prefix, nil
}
if !isMinioNotFound(err) {
return "", fmt.Errorf("ai_summarizer: stat tender.json under %s: %w", prefix, err)
return "", s.logMinIOFailure("stat_tender_json", err, map[string]interface{}{
"prefix": prefix,
"contract_folder_id": contractFolderID,
"notice_id": noticePublicationID,
})
}
}
@@ -241,7 +248,11 @@ func (s *StorageClient) resolveNoticeStoragePrefix(ctx context.Context, contract
})
for object := range objectCh {
if object.Err != nil {
return "", fmt.Errorf("ai_summarizer: search notice folder: %w", object.Err)
return "", s.logMinIOFailure("list_notice_folder", object.Err, map[string]interface{}{
"notice_id": noticePublicationID,
"contract_folder_id": contractFolderID,
"notice_key": noticeKey,
})
}
if idx := strings.Index(object.Key, marker); idx >= 0 {
resolved = object.Key[:idx+len(marker)]
@@ -290,6 +301,15 @@ func (s *StorageClient) GetSummaryFromStorage(ctx context.Context, contractFolde
prefix, err := s.resolveNoticeStoragePrefix(ctx, contractFolderID, noticePublicationID)
if err != nil {
if !errors.Is(err, ErrObjectNotFound) {
s.logger.Warn("Failed to resolve MinIO path for tender summary", map[string]interface{}{
"endpoint": s.config.MinioEndpoint,
"bucket": s.config.MinioBucket,
"contract_folder_id": contractFolderID,
"notice_id": noticePublicationID,
"error": err.Error(),
})
}
return "", err
}
return s.getSummaryFromObjectKey(ctx, prefix+"tender.json", contractFolderID, noticePublicationID)
@@ -346,9 +366,13 @@ func (s *StorageClient) readTenderJSONAtKey(ctx context.Context, objectKey strin
}
var minioErr minio.ErrorResponse
if errors.As(err, &minioErr) && minioErr.StatusCode == http.StatusForbidden {
return nil, fmt.Errorf("ai_summarizer: access denied to bucket %s: %w", s.config.MinioBucket, err)
return nil, s.logMinIOFailure("get_object", err, map[string]interface{}{
"object_key": objectKey,
})
}
return nil, fmt.Errorf("ai_summarizer: failed to get object: %w", err)
return nil, s.logMinIOFailure("get_object", err, map[string]interface{}{
"object_key": objectKey,
})
}
defer object.Close()
@@ -361,7 +385,9 @@ func (s *StorageClient) readTenderJSONAtKey(ctx context.Context, objectKey strin
})
return nil, ErrObjectNotFound
}
return nil, fmt.Errorf("ai_summarizer: failed to read tender.json: %w", err)
return nil, s.logMinIOFailure("read_tender_json", err, map[string]interface{}{
"object_key": objectKey,
})
}
var tenderJSON TenderJSON
@@ -547,10 +573,16 @@ func (s *StorageClient) DownloadDocument(ctx context.Context, objectName string)
// under the PROC_ prefix; if none match, it falls back to a full-bucket recursive
// scan (slower on large buckets) so alternate key layouts still work.
func (s *StorageClient) GetAllSummaries(ctx context.Context) ([]TenderSummaryItem, error) {
s.logger.Info("Listing all tender summaries from MinIO", map[string]interface{}{
"endpoint": s.config.MinioEndpoint,
"bucket": s.config.MinioBucket,
})
results := make([]TenderSummaryItem, 0)
seen := make(map[string]struct{})
var fatalErr error
appendFromPrefix := func(prefix string) {
appendFromPrefix := func(prefix string) bool {
s.logger.Debug("Listing tender.json files from MinIO", map[string]interface{}{
"bucket": s.config.MinioBucket,
"prefix": prefix,
@@ -563,11 +595,10 @@ func (s *StorageClient) GetAllSummaries(ctx context.Context) ([]TenderSummaryIte
for object := range objectCh {
if object.Err != nil {
s.logger.Error("Error listing MinIO objects", map[string]interface{}{
fatalErr = s.logMinIOFailure("list_tender_json", object.Err, map[string]interface{}{
"prefix": prefix,
"error": object.Err.Error(),
})
continue
return false
}
key := object.Key
if !strings.HasSuffix(key, "/tender.json") {
@@ -606,6 +637,9 @@ func (s *StorageClient) GetAllSummaries(ctx context.Context) ([]TenderSummaryIte
OverallSummary: "",
Done: true,
})
case errors.Is(err, ErrMinIOUnavailable):
fatalErr = err
return false
default:
s.logger.Debug("Skipping tender summary", map[string]interface{}{
"object_key": key,
@@ -624,17 +658,28 @@ func (s *StorageClient) GetAllSummaries(ctx context.Context) ([]TenderSummaryIte
Done: true,
})
}
return true
}
appendFromPrefix(procedurePrefix)
if !appendFromPrefix(procedurePrefix) {
return nil, fatalErr
}
if len(seen) == 0 {
s.logger.Info("No tender.json keys under PROC_; listing entire bucket for */tender.json (may be slower on large buckets)", map[string]interface{}{
"bucket": s.config.MinioBucket,
})
appendFromPrefix("")
if !appendFromPrefix("") {
return nil, fatalErr
}
}
if fatalErr != nil {
return nil, fatalErr
}
s.logger.Info("Retrieved all summaries from storage", map[string]interface{}{
"endpoint": s.config.MinioEndpoint,
"bucket": s.config.MinioBucket,
"total_count": len(results),
"completed_count": countDone(results),
})