Documentation
¶
Overview ¶
The contents of this file should be all thread safe Global functions for use with templates
Index ¶
- Constants
- Variables
- func CachedByKey(k string) string
- func CachedByVal(v string) string
- func Error(msg string) (bool, error)
- func GetAnomalies() string
- func GetMounts(host, index string) ([]string, error)
- func ParseDialog(input []byte) (slack.Dialog, error)
- func ParseInteractionCallback(b []byte) (slack.InteractionCallback, error)
- func ParseMessage(input []byte) (slack.Message, error)
- func ReadTemplates(dir string) (*template.Template, map[string]*TemplateMetadata, error)
- func TruncatePath(p string, max int) string
- type Action
- type ActionInput
- type ActionResult
- type EnvironmentParams
- type FeedbackMessage
- type HelperStatus
- type Identity
- type KafkaMessageType
- type ResponseType
- type Slack
- func (s *Slack) AtsuEventHandler(w http.ResponseWriter, r *http.Request)
- func (s *Slack) AuthorizeHandler(w http.ResponseWriter, r *http.Request)
- func (s *Slack) CallbackHandler(w http.ResponseWriter, r *http.Request)
- func (s *Slack) ConvertBlockAction(message slack.InteractionCallback) *Action
- func (s *Slack) ConvertCommandInput(teamId, teamDomain, channel, user, input string) (*Action, error)
- func (s *Slack) ConvertInteractionCallback(sa slack.InteractionCallback) *Action
- func (s *Slack) DelayedInteractionHandler(w http.ResponseWriter, r *http.Request)
- func (s *Slack) EnvParams() EnvironmentParams
- func (s *Slack) EventHandler(w http.ResponseWriter, r *http.Request)
- func (s *Slack) ExecuteAction(action *Action) (*ActionResult, error)
- func (s *Slack) ImmediateInteractionHandler(w http.ResponseWriter, r *http.Request)
- func (s *Slack) KafkaSend(mt KafkaMessageType, data TemplateData)
- func (s *Slack) LoadTemplates() error
- func (s *Slack) NewAction(input ActionInput) *Action
- func (s *Slack) OnDemandTemplateHandler(w http.ResponseWriter, r *http.Request)
- func (s *Slack) SendErrorResponse(err error, rt ResponseType, teamId, channel, responseUrl string)
- func (s *Slack) SendResultResponse(result *ActionResult)
- func (s *Slack) SendToChannel(team string, channel string, options ...slack.MsgOption)
- func (s *Slack) SetDebug(b bool)
- func (s *Slack) SlashHandler(w http.ResponseWriter, r *http.Request)
- func (s *Slack) Start(router *mux.Router, r *relay.Relay) error
- func (s *Slack) Status() SlackStatus
- func (s *Slack) Stop()
- func (s *Slack) VerifyRequest(h http.Header, body []byte) bool
- type SlackAuthResponse
- type SlackConfig
- type SlackInstance
- type SlackStatus
- type SlackWebHook
- type TemplateData
- type TemplateMetadata
- type TwoWayCache
Constants ¶
const ( EventEndpoint = "/slack/event" InterctEndpoint = "/slack/interact" SlashEndpoint = "/slack/slash" LoadActionsEndpoint = "/slack/load-actions" AtsuEventEndpoint = "/slack/atsu-event" SlackAuthorizeEndpoint = "/slack/authorize" SlackCallbackEndpoint = "/slack/callback" SlackOnDemandTplEndpoint = "/slack/on-demand-template" FreeformTemplate = "_freeform.tpl" FreeformPassword = "YXRzdS10by10aGUtbW9vbiEhIQ==" // TODO XXX hard-coded for now SlackAuthorizeUrl = "https://slack.com/oauth/v2/authorize" SlackAccessUrl = "https://slack.com/api/oauth.v2.access" )
const ( // Feedback is the kafka message type for responding to alerts, see `_alert_response.tpl` Feedback = KafkaMessageType("feedback") )
Variables ¶
var Channel = ResponseType("channel")
var Dialog = ResponseType("dialog")
var Direct = ResponseType("direct")
var GlobalCache = NewCache(time.Minute, defaultExpiryCapacity)
GlobalCache always gets initialized and can be used simply with no other initialization
var HelperMetrics = &helperInstrument{ slowRequestThresh: time.Second * 3, elasticSearchSlowRequests: make([]slowRequest, 0, 20), elasticSearchResponseTimeSecs: metric.NewHistogram("1h1h"), elasticSearchRequestCount: metric.NewCounter("1h1h"), }
HelperMetrics is an object to make instrumenting what happens in the helper functions easier
var None = ResponseType("none")
var WebHook = ResponseType("webhook")
Functions ¶
func CachedByKey ¶
func CachedByVal ¶
func GetAnomalies ¶
func GetAnomalies() string
func ParseInteractionCallback ¶
func ParseInteractionCallback(b []byte) (slack.InteractionCallback, error)
func ParseMessage ¶
ParseMessage is convenience helper for translating a json []byte into a slack.Message
func ReadTemplates ¶
func TruncatePath ¶
TruncatePath is a helper for trimming paths to a specific size limit we try to keep it pretty by chopping off inner path segments eg '/one/two/three/four/five' becomes '/one/*/five' for 11 char limit
if the last segment is > char limit, we simply truncate the name eg '/one/two/somelongfilename' becomes '*name' for 5 char limit
Types ¶
type Action ¶
type Action struct { OnDemand bool // should this action use an on-demand template ResponseType ResponseType ResponseUrl string Channel string TriggerId string Id string TeamId string TemplateName string TemplateMeta TemplateMetadata Data TemplateData }
Action is an encapsulation of a slack template execution. We run the template name against the template data.
func (*Action) SetResponse ¶
func (a *Action) SetResponse(rt ResponseType, responseUrl, channel, triggerId string)
type ActionInput ¶
type ActionInput struct { OnDemand bool Id string TeamId string Team string Channel string User string InputText string InteractionData map[string]interface{} TemplateName string }
func (*ActionInput) Validate ¶
func (ai *ActionInput) Validate() error
type ActionResult ¶
type ActionResult struct { TeamId string Error error Action *Action ResponseUrl string Channel string TriggerId string ResponseType ResponseType SendToKafka bool KafkaMessageType KafkaMessageType Data TemplateData ProcessedTemplate []byte }
func (ActionResult) String ¶
func (ar ActionResult) String() string
type EnvironmentParams ¶
type FeedbackMessage ¶
type FeedbackMessage struct { User string `json:"user"` Label float64 `json:"label"` Value float64 `json:"value,omitempty"` AtsuId string `json:"atsu_id,omitempty"` Etype string `json:"etype,omitempty"` }
FeedbackMessage corresponds to the KafkaMessageType `Feedback`, this struct dictates the json format.
type HelperStatus ¶
type HelperStatus struct { ElasticSearchResponseTimeSecs interface{} ElasticSearchRequestCount interface{} ElasticSearchSlowRequests interface{} }
type KafkaMessageType ¶
type KafkaMessageType string
KafkaMessageType dictates the how messages should be sent to kafka it can change the message format as well as which topic sent to.
type ResponseType ¶
type ResponseType string
type Slack ¶
type Slack struct {
// contains filtered or unexported fields
}
func NewSlack ¶
func NewSlack(cfg SlackConfig, com interfaces.ChatOpsCom, database db.Database) *Slack
func (*Slack) AtsuEventHandler ¶
func (s *Slack) AtsuEventHandler(w http.ResponseWriter, r *http.Request)
AtsuEventHandler handles incoming requests from atsu this is a mechanism to translate an incoming request to a slack event. On demand templates can be run if the 'od' query parameter is truthy.
func (*Slack) AuthorizeHandler ¶
func (s *Slack) AuthorizeHandler(w http.ResponseWriter, r *http.Request)
func (*Slack) CallbackHandler ¶
func (s *Slack) CallbackHandler(w http.ResponseWriter, r *http.Request)
func (*Slack) ConvertBlockAction ¶
func (s *Slack) ConvertBlockAction(message slack.InteractionCallback) *Action
ConvertBlockAction translates a block action into an Action
func (*Slack) ConvertCommandInput ¶
func (s *Slack) ConvertCommandInput(teamId, teamDomain, channel, user, input string) (*Action, error)
ConvertCommandInput translates a string input into an Action this assumes the input is in a space delimited format that looks like a command line action with flags, stripping slack user ids example input: "action action2 -flag value -flag2 value2 -flag3" would be interpreted as attempting to process template "action_action2" with the map { "flag":"value", "flag2":"value2","flag3":true } *note* if template "action_action2" is not found, we will look for template "action"
func (*Slack) ConvertInteractionCallback ¶
func (s *Slack) ConvertInteractionCallback(sa slack.InteractionCallback) *Action
func (*Slack) DelayedInteractionHandler ¶
func (s *Slack) DelayedInteractionHandler(w http.ResponseWriter, r *http.Request)
DelayedInteractionHandler handles interactivity events from slack (https://api.slack.com/messaging/interactivity#components)
func (*Slack) EnvParams ¶
func (s *Slack) EnvParams() EnvironmentParams
func (*Slack) EventHandler ¶
func (s *Slack) EventHandler(w http.ResponseWriter, r *http.Request)
EventHandler handles events from the slack events api (https://api.slack.com/events-api) this is for subscribed events such as mentions
func (*Slack) ExecuteAction ¶
func (s *Slack) ExecuteAction(action *Action) (*ActionResult, error)
ExecuteAction executes an Action which is typically processing a template or sending a message to kafka returns an ActionResult if further action is required, typically an ActionResult is returned if there is still something that needs to go back to slack.
func (*Slack) ImmediateInteractionHandler ¶
func (s *Slack) ImmediateInteractionHandler(w http.ResponseWriter, r *http.Request)
ImmediateInteractionHandler handles interactivity events from slack (https://api.slack.com/messaging/interactivity#components)
func (*Slack) KafkaSend ¶
func (s *Slack) KafkaSend(mt KafkaMessageType, data TemplateData)
KafkaSend will produce a message to kafka based on the message type and template data.
func (*Slack) LoadTemplates ¶
func (*Slack) NewAction ¶
func (s *Slack) NewAction(input ActionInput) *Action
func (*Slack) OnDemandTemplateHandler ¶
func (s *Slack) OnDemandTemplateHandler(w http.ResponseWriter, r *http.Request)
OnDemandTemplateHandler is a handler that will attempt to load a template from the
post body payload. ex:
{{/* Template Info --- name: od-test description: an example on demand template --- */}}
{"blocks": [{ "type": "section", "text": { "type": "mrkdwn", "text": "{{ .InteractionData.text }}" }}] }
see the AtsuEventHandler for information about on demand templates.
func (*Slack) SendErrorResponse ¶
func (s *Slack) SendErrorResponse(err error, rt ResponseType, teamId, channel, responseUrl string)
SendErrorResponse is for sending a direct response through slack to the user (via response url) or channel this effectively populates the default error template and posts it back to slack for the 'sorry an error happened' type failure.
func (*Slack) SendResultResponse ¶
func (s *Slack) SendResultResponse(result *ActionResult)
SendResultResponse evaluates the ActionResult and sends the appropriate response payload back to slack
func (*Slack) SendToChannel ¶
SendToChannel sends the provided options list to the provided slack channel
func (*Slack) SlashHandler ¶
func (s *Slack) SlashHandler(w http.ResponseWriter, r *http.Request)
SlashHandler handles slack slash command events (https://api.slack.com/slash-commands)
func (*Slack) Status ¶
func (s *Slack) Status() SlackStatus
func (*Slack) VerifyRequest ¶
VerifyRequest https://api.slack.com/docs/verifying-requests-from-slack
type SlackAuthResponse ¶
type SlackAuthResponse struct { Ok bool `json:"ok"` AccessToken string `json:"access_token"` TokenType string `json:"token_type"` Scope string `json:"scope"` BotUserId string `json:"bot_user_id"` AppId string `json:"app_id"` Team Identity `json:"team"` Enterprise Identity `json:"enterprise"` IncomingWebHook SlackWebHook `json:"incoming_webhook"` }
func (*SlackAuthResponse) String ¶
func (s *SlackAuthResponse) String() string
type SlackConfig ¶
type SlackConfig struct { AppId string Token string VerificationToken string SecretSigningKey string InWebHook string FeedbackTopic string ClientId string ClientSecret string AuthRedirectUrl string TemplateDir string }
func (SlackConfig) Validate ¶
func (cfg SlackConfig) Validate() error
type SlackInstance ¶
type SlackStatus ¶
type SlackStatus struct { Health health.State `json:"health"` ResponseTimeSecs interface{} SlashCounter interface{} EventCounter interface{} InteractCounter interface{} LoadActionCounter interface{} AtsuEventCounter interface{} ErrorsCounter interface{} TemplateErrorsCounter interface{} ErrorTimes []int64 ErrorsRecent []string Events int64 `json:"events"` Errors int64 `json:"errors"` }
type SlackWebHook ¶
type TemplateData ¶
type TemplateData struct { EnvironmentParams Team string Channel string User string InputText string Timestamp int64 InteractionData map[string]interface{} }
TemplateData is intended to be fed into a template to give template authors system level settings along with the interaction data that comes back from interactions
func (*TemplateData) FeedbackMessage ¶
func (t *TemplateData) FeedbackMessage() FeedbackMessage
FeedbackMessage generates a FeedbackMessage object from the TemplateData object
type TemplateMetadata ¶
type TemplateMetadata struct { Name string Description string SendToKafka bool KafkaMessageType string IsTerminating bool Dialog bool Extra map[string]interface{} }
TemplateMetadata encapsulates values passed from the template via ParseTemplateMetadataFile
func ParseTemplateMetadata ¶
func ParseTemplateMetadata(data io.Reader) (*TemplateMetadata, error)
func ParseTemplateMetadataFile ¶
func ParseTemplateMetadataFile(file string) (*TemplateMetadata, error)
ParseTemplateMetadataFile reads the template file, extracts the yml at the top into a struct. Valid templates should have --- marked yml eg --- myfield: asdf mysecondfield: 123 ---
func ReadOnDemandTemplate ¶
type TwoWayCache ¶
type TwoWayCache struct {
// contains filtered or unexported fields
}
TwoWayCache is a cache where you can retrieve values by key as well as key by value this implementation is fully thread safe, for use in asynchronous template execution
func NewCache ¶
func NewCache(duration time.Duration, capacity int) TwoWayCache
NewCache create a new instance, takes in the entry cache lifetime, and the default capacity. the cache will begin to expire items once the capacity is reached.
func (*TwoWayCache) Add ¶
func (t *TwoWayCache) Add(key, val interface{})
Add a new key value pair to the cache
func (*TwoWayCache) GetByKey ¶
func (t *TwoWayCache) GetByKey(key interface{}) (interface{}, bool)
GetByKey retrieve the value by the supplied key
func (*TwoWayCache) GetByValue ¶
func (t *TwoWayCache) GetByValue(val interface{}) (interface{}, bool)
GetByValue retrieve the key by the supplied value