minio connection log
This commit is contained in:
@@ -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),
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user