module/apmazure/queue.go (103 lines of code) (raw):

// Licensed to Elasticsearch B.V. under one or more contributor // license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright // ownership. Elasticsearch B.V. licenses this file to you under // the Apache License, Version 2.0 (the "License"); you may // not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. package apmazure // import "go.elastic.co/apm/module/apmazure/v2" import ( "fmt" "net/http" "net/url" "strings" "github.com/Azure/azure-pipeline-go/pipeline" ) type queueRPC struct { accountName string resourceName string req pipeline.Request queueName string } func (q *queueRPC) name() string { return fmt.Sprintf("AzureQueue %s %s %s", q.operation(), q.dir(), q.queueName) } func (q *queueRPC) _type() string { return "messaging" } func (q *queueRPC) subtype() string { return "azurequeue" } func (q *queueRPC) targetName() string { return q.queueName } func (q *queueRPC) storageAccountName() string { return q.accountName } func (q *queueRPC) resource() string { return q.resourceName } func (q *queueRPC) dir() string { switch q.req.Method { case http.MethodGet, "": return "from" default: return "to" } } func (q *queueRPC) operation() string { query := q.req.URL.Query() switch q.req.Method { // From net/http documentation: // For client requests, an empty string means GET. case http.MethodGet, "": return q.getOperation(query) case http.MethodPost: return q.postOperation(query) case http.MethodHead: return q.headOperation(query) case http.MethodPut: return q.putOperation(query) case http.MethodOptions: return "PREFLIGHT" case http.MethodDelete: if strings.HasSuffix(q.req.URL.Path, "/messages") { return "CLEAR" } return "DELETE" default: return q.req.Method } } func (q *queueRPC) getOperation(v url.Values) string { if peekOnly := v.Get("peekonly"); peekOnly == "true" { return "PEEK" } switch comp := v.Get("comp"); comp { case "": return "RECEIVE" case "list": return "LISTQUEUES" case "stats": return "STATS" case "properties", "metadata", "acl": return "GET" + strings.ToUpper(comp) default: return "unknown operation" } } func (q *queueRPC) postOperation(v url.Values) string { return "SEND" } func (q *queueRPC) headOperation(v url.Values) string { switch comp := v.Get("comp"); comp { case "metadata", "acl": return "GET" + strings.ToUpper(comp) default: return "unknown operation" } } func (q *queueRPC) putOperation(v url.Values) string { if _, ok := v["popreceipt"]; ok { return "UPDATE" } switch comp := v.Get("comp"); comp { case "": return "CREATE" case "metadata", "acl", "properties": return "SET" + strings.ToUpper(comp) default: return "unknown operation" } }