Skip to content
Snippets Groups Projects
Select Git revision
  • fd8b9b2062a8d904462093ad4331915687e81eab
  • main default protected
  • v1.303.0
  • v1.302.0
  • v1.301.0
  • v1.300.0
  • v1.299.0
  • 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
22 results

api-logs.go

Blame
  • api-logs.go 5.37 KiB
    package logs
    
    import (
    	"net/http"
    	"sort"
    	"strings"
    	"time"
    
    	"github.com/aws/aws-lambda-go/events"
    	"gitlab.com/uafrica/go-utils/errors"
    	"gitlab.com/uafrica/go-utils/queues"
    )
    
    var producer queues.Producer
    
    func Init(p queues.Producer) {
    	producer = p
    }
    
    //Call this at the end of an API request handler to capture the req/res as well as all actions taken during the processing
    //(note: action list is only reset when this is called - so must be called after each handler, else action list has to be reset at the start)
    func LogIncomingAPIRequest(startTime time.Time, requestID string, claim map[string]interface{}, req events.APIGatewayProxyRequest, res events.APIGatewayProxyResponse) error {
    	if producer == nil {
    		return errors.Errorf("logs queue producer not set")
    	}
    
    	//todo: filter out some noisy (method+path)
    
    	endTime := time.Now()
    
    	var authType string
    	var authUsername string
    	if req.RequestContext.Identity.CognitoAuthenticationType != "" {
    		authType = "cognito"
    		split := strings.Split(req.RequestContext.Identity.CognitoAuthenticationProvider, ":")
    		if len(split) > 0 {
    			authUsername = split[len(split)-1] //= part after last ':'
    		}
    	} else {
    		authType = "iam"
    		split := strings.Split(req.RequestContext.Identity.UserArn, ":user/")
    		if len(split) > 0 {
    			authUsername = split[len(split)-1] //= part after ':user/'
    		}
    	}
    
    	username, _ := claim["user_id"].(string)
    	accountID, _ := claim["account_id"].(int64)
    	apiLog := ApiLog{
    		StartTime:           startTime,
    		EndTime:             endTime,
    		DurMs:               endTime.Sub(startTime).Milliseconds(),
    		Method:              req.HTTPMethod,
    		Address:             req.RequestContext.DomainName,
    		Path:                req.Path,
    		ResponseCode:        res.StatusCode,
    		RequestID:           requestID,
    		InitialAuthType:     authType,
    		InitialAuthUsername: authUsername,
    		SourceIP:            req.RequestContext.Identity.SourceIP,
    		UserAgent:           req.RequestContext.Identity.UserAgent,
    		Username:            username,
    		AccountID:           accountID,
    		Request: ApiLogRequest{
    			Headers:         req.Headers,
    			QueryParameters: req.QueryStringParameters,
    			BodySize:        len(req.Body),
    			Body:            req.Body,
    		},
    		Response: ApiLogResponse{