Skip to content
Snippets Groups Projects
Select Git revision
  • c618256d35a120a2941159927c54f542b4fc125e
  • main default protected
  • v1.298.0
  • v1.297.0
  • v1.296.0
  • v1.295.0
  • v1.294.0
  • v1.293.0
  • v1.292.0
  • v1.291.0
  • v1.290.0
  • v1.289.0
  • v1.288.0
  • v1.287.0
  • v1.286.0
  • v1.285.0
  • v1.284.0
  • v1.283.0
  • v1.282.0
  • v1.281.0
  • v1.280.0
  • v1.279.0
22 results

database_logs.go

Blame
  • database_logs.go 2.11 KiB
    package logs
    
    import (
    	"context"
    	"github.com/samber/lo"
    	"github.com/uptrace/bun"
    	"reflect"
    	"strings"
    	"time"
    )
    
    var ignoredTableInserts = []string{
    	"sync_audit",
    	"audit_events",
    	"audit",
    	"communication_logs",
    	"sync_product_variants",
    	"webhook_events",
    	"notification_audit_events",
    	"rollup_age_analysis",
    	"rollup_transactions",
    	"rollup_shipments_charges",
    	"rollup_shipments_events",
    	"rollup_tripsheet",
    	"rollup_branches",
    	"cron_shipment_updates",
    	"cron_delayed_shipment_patch",
    	"orders_rollup",
    	"shipments_rollup",
    	"revenue_rollup",
    }
    
    type QueryHook struct {
    	IgnoredTableInserts []string
    	Debug               bool
    }
    
    func (d QueryHook) BeforeQuery(ctx context.Context, _ *bun.QueryEvent) context.Context {
    	return ctx
    }
    
    func (d QueryHook) AfterQuery(_ context.Context, event *bun.QueryEvent) {
    	sqlQuery := event.Query
    
    	queryDuration := time.Now().Sub(event.StartTime)
    
    	queryPrefixesToIgnore := []string{"SELECT", "BEGIN", "COMMIT"}
    	shouldLogQuery := !strings.Contains(sqlQuery, "api_key")
    
    	// Don't log queries for certain tables
    	ignoredTableInsertsCombined := append(ignoredTableInserts, d.IgnoredTableInserts...)
    	tableName := TableNameForQuery(event)
    	if lo.Contains(ignoredTableInsertsCombined, tableName) {
    		shouldLogQuery = false
    	}
    
    	if shouldLogQuery {
    		for _, prefixToIgnore := range queryPrefixesToIgnore {
    			if strings.HasPrefix(sqlQuery, prefixToIgnore) {
    				shouldLogQuery = false
    				break
    			}
    		}
    	}
    
    	if d.Debug || shouldLogQuery {
    		InfoWithFields(map[string]interface{}{"sql": sqlQuery, "t": queryDuration.String()}, "")
    	}
    	return
    }
    
    func TableNameForQuery(event *bun.QueryEvent) string {
    	if event.Model == nil {
    		return ""
    	}
    
    	model := event.Model.Value()
    	if model == nil {
    		return ""
    	}
    
    	var modelObject reflect.Type
    	t := reflect.TypeOf(model)
    	pointerToObject := t.Elem()
    
    	if pointerToObject.Kind() == reflect.Slice {
    		// Object is an array of objects. Get the struct type from the array
    		sliceObject := pointerToObject.Elem()
    		modelObject = sliceObject
    	} else {
    		// Object is a struct
    		modelObject = pointerToObject
    	}
    
    	tableName := event.DB.Table(modelObject).Name
    	return tableName
    }