MM-21626, MM-21627 - Plugin API/Hooks Prometheus instrumentati… (#13825)

* MM-21626,MM-21627 - Plugin API/Hooks Prometheus instrumentation

* Updated einterface mocks

* Fixed supervisor tests

* ignoring golint errors for plugin metrics wrappers

* Making golangci happy

* Using variadic form when generating wrapper code

* Removed artificial delay

* Removed comments from tests

* Renaming plugin wrappers to api/hooks_timer_layer

* updating vendor dir and mod files

* Recording plugin api/hook responses in prometheus

* Updated einterfaces-mocks

* Updating go sum

* Updating go sum

* Fixing conflicts

* More conflicts fixing

Co-authored-by: mattermod <mattermod@users.noreply.github.com>
Этот коммит содержится в:
Ali Farooq
2020-02-14 15:47:43 -05:00
коммит произвёл GitHub
родитель 7da85922af
Коммит e4fb5791b0
49 изменённых файлов: 17005 добавлений и 68 удалений

989
plugin/api_timer_layer_generated.go Обычный файл
Просмотреть файл

@@ -0,0 +1,989 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
// Code generated by "make pluginapi"
// DO NOT EDIT
package plugin
import (
"io"
"net/http"
timePkg "time"
"github.com/mattermost/mattermost-server/v5/einterfaces"
"github.com/mattermost/mattermost-server/v5/model"
)
type apiTimerLayer struct {
pluginID string
apiImpl API
metrics einterfaces.MetricsInterface
}
func (api *apiTimerLayer) recordTime(startTime timePkg.Time, name string, success bool) {
if api.metrics != nil {
elapsedTime := float64(timePkg.Since(startTime)) / float64(timePkg.Second)
api.metrics.ObservePluginApiDuration(api.pluginID, name, success, elapsedTime)
}
}
func (api *apiTimerLayer) LoadPluginConfiguration(dest interface{}) error {
startTime := timePkg.Now()
_returnsA := api.apiImpl.LoadPluginConfiguration(dest)
api.recordTime(startTime, "LoadPluginConfiguration", true)
return _returnsA
}
func (api *apiTimerLayer) RegisterCommand(command *model.Command) error {
startTime := timePkg.Now()
_returnsA := api.apiImpl.RegisterCommand(command)
api.recordTime(startTime, "RegisterCommand", true)
return _returnsA
}
func (api *apiTimerLayer) UnregisterCommand(teamId, trigger string) error {
startTime := timePkg.Now()
_returnsA := api.apiImpl.UnregisterCommand(teamId, trigger)
api.recordTime(startTime, "UnregisterCommand", true)
return _returnsA
}
func (api *apiTimerLayer) GetSession(sessionId string) (*model.Session, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetSession(sessionId)
api.recordTime(startTime, "GetSession", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetConfig() *model.Config {
startTime := timePkg.Now()
_returnsA := api.apiImpl.GetConfig()
api.recordTime(startTime, "GetConfig", true)
return _returnsA
}
func (api *apiTimerLayer) GetUnsanitizedConfig() *model.Config {
startTime := timePkg.Now()
_returnsA := api.apiImpl.GetUnsanitizedConfig()
api.recordTime(startTime, "GetUnsanitizedConfig", true)
return _returnsA
}
func (api *apiTimerLayer) SaveConfig(config *model.Config) *model.AppError {
startTime := timePkg.Now()
_returnsA := api.apiImpl.SaveConfig(config)
api.recordTime(startTime, "SaveConfig", true)
return _returnsA
}
func (api *apiTimerLayer) GetPluginConfig() map[string]interface{} {
startTime := timePkg.Now()
_returnsA := api.apiImpl.GetPluginConfig()
api.recordTime(startTime, "GetPluginConfig", true)
return _returnsA
}
func (api *apiTimerLayer) SavePluginConfig(config map[string]interface{}) *model.AppError {
startTime := timePkg.Now()
_returnsA := api.apiImpl.SavePluginConfig(config)
api.recordTime(startTime, "SavePluginConfig", true)
return _returnsA
}
func (api *apiTimerLayer) GetBundlePath() (string, error) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetBundlePath()
api.recordTime(startTime, "GetBundlePath", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetLicense() *model.License {
startTime := timePkg.Now()
_returnsA := api.apiImpl.GetLicense()
api.recordTime(startTime, "GetLicense", true)
return _returnsA
}
func (api *apiTimerLayer) GetServerVersion() string {
startTime := timePkg.Now()
_returnsA := api.apiImpl.GetServerVersion()
api.recordTime(startTime, "GetServerVersion", true)
return _returnsA
}
func (api *apiTimerLayer) GetSystemInstallDate() (int64, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetSystemInstallDate()
api.recordTime(startTime, "GetSystemInstallDate", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetDiagnosticId() string {
startTime := timePkg.Now()
_returnsA := api.apiImpl.GetDiagnosticId()
api.recordTime(startTime, "GetDiagnosticId", true)
return _returnsA
}
func (api *apiTimerLayer) CreateUser(user *model.User) (*model.User, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.CreateUser(user)
api.recordTime(startTime, "CreateUser", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) DeleteUser(userId string) *model.AppError {
startTime := timePkg.Now()
_returnsA := api.apiImpl.DeleteUser(userId)
api.recordTime(startTime, "DeleteUser", true)
return _returnsA
}
func (api *apiTimerLayer) GetUsers(options *model.UserGetOptions) ([]*model.User, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetUsers(options)
api.recordTime(startTime, "GetUsers", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetUser(userId string) (*model.User, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetUser(userId)
api.recordTime(startTime, "GetUser", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetUserByEmail(email string) (*model.User, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetUserByEmail(email)
api.recordTime(startTime, "GetUserByEmail", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetUserByUsername(name string) (*model.User, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetUserByUsername(name)
api.recordTime(startTime, "GetUserByUsername", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetUsersByUsernames(usernames []string) ([]*model.User, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetUsersByUsernames(usernames)
api.recordTime(startTime, "GetUsersByUsernames", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetUsersInTeam(teamId string, page int, perPage int) ([]*model.User, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetUsersInTeam(teamId, page, perPage)
api.recordTime(startTime, "GetUsersInTeam", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetTeamIcon(teamId string) ([]byte, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetTeamIcon(teamId)
api.recordTime(startTime, "GetTeamIcon", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) SetTeamIcon(teamId string, data []byte) *model.AppError {
startTime := timePkg.Now()
_returnsA := api.apiImpl.SetTeamIcon(teamId, data)
api.recordTime(startTime, "SetTeamIcon", true)
return _returnsA
}
func (api *apiTimerLayer) RemoveTeamIcon(teamId string) *model.AppError {
startTime := timePkg.Now()
_returnsA := api.apiImpl.RemoveTeamIcon(teamId)
api.recordTime(startTime, "RemoveTeamIcon", true)
return _returnsA
}
func (api *apiTimerLayer) UpdateUser(user *model.User) (*model.User, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.UpdateUser(user)
api.recordTime(startTime, "UpdateUser", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetUserStatus(userId string) (*model.Status, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetUserStatus(userId)
api.recordTime(startTime, "GetUserStatus", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetUserStatusesByIds(userIds []string) ([]*model.Status, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetUserStatusesByIds(userIds)
api.recordTime(startTime, "GetUserStatusesByIds", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) UpdateUserStatus(userId, status string) (*model.Status, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.UpdateUserStatus(userId, status)
api.recordTime(startTime, "UpdateUserStatus", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) UpdateUserActive(userId string, active bool) *model.AppError {
startTime := timePkg.Now()
_returnsA := api.apiImpl.UpdateUserActive(userId, active)
api.recordTime(startTime, "UpdateUserActive", true)
return _returnsA
}
func (api *apiTimerLayer) GetUsersInChannel(channelId, sortBy string, page, perPage int) ([]*model.User, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetUsersInChannel(channelId, sortBy, page, perPage)
api.recordTime(startTime, "GetUsersInChannel", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetLDAPUserAttributes(userId string, attributes []string) (map[string]string, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetLDAPUserAttributes(userId, attributes)
api.recordTime(startTime, "GetLDAPUserAttributes", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) CreateTeam(team *model.Team) (*model.Team, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.CreateTeam(team)
api.recordTime(startTime, "CreateTeam", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) DeleteTeam(teamId string) *model.AppError {
startTime := timePkg.Now()
_returnsA := api.apiImpl.DeleteTeam(teamId)
api.recordTime(startTime, "DeleteTeam", true)
return _returnsA
}
func (api *apiTimerLayer) GetTeams() ([]*model.Team, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetTeams()
api.recordTime(startTime, "GetTeams", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetTeam(teamId string) (*model.Team, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetTeam(teamId)
api.recordTime(startTime, "GetTeam", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetTeamByName(name string) (*model.Team, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetTeamByName(name)
api.recordTime(startTime, "GetTeamByName", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetTeamsUnreadForUser(userId string) ([]*model.TeamUnread, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetTeamsUnreadForUser(userId)
api.recordTime(startTime, "GetTeamsUnreadForUser", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) UpdateTeam(team *model.Team) (*model.Team, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.UpdateTeam(team)
api.recordTime(startTime, "UpdateTeam", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) SearchTeams(term string) ([]*model.Team, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.SearchTeams(term)
api.recordTime(startTime, "SearchTeams", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetTeamsForUser(userId string) ([]*model.Team, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetTeamsForUser(userId)
api.recordTime(startTime, "GetTeamsForUser", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) CreateTeamMember(teamId, userId string) (*model.TeamMember, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.CreateTeamMember(teamId, userId)
api.recordTime(startTime, "CreateTeamMember", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) CreateTeamMembers(teamId string, userIds []string, requestorId string) ([]*model.TeamMember, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.CreateTeamMembers(teamId, userIds, requestorId)
api.recordTime(startTime, "CreateTeamMembers", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) CreateTeamMembersGracefully(teamId string, userIds []string, requestorId string) ([]*model.TeamMemberWithError, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.CreateTeamMembersGracefully(teamId, userIds, requestorId)
api.recordTime(startTime, "CreateTeamMembersGracefully", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) DeleteTeamMember(teamId, userId, requestorId string) *model.AppError {
startTime := timePkg.Now()
_returnsA := api.apiImpl.DeleteTeamMember(teamId, userId, requestorId)
api.recordTime(startTime, "DeleteTeamMember", true)
return _returnsA
}
func (api *apiTimerLayer) GetTeamMembers(teamId string, page, perPage int) ([]*model.TeamMember, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetTeamMembers(teamId, page, perPage)
api.recordTime(startTime, "GetTeamMembers", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetTeamMember(teamId, userId string) (*model.TeamMember, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetTeamMember(teamId, userId)
api.recordTime(startTime, "GetTeamMember", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetTeamMembersForUser(userId string, page int, perPage int) ([]*model.TeamMember, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetTeamMembersForUser(userId, page, perPage)
api.recordTime(startTime, "GetTeamMembersForUser", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) UpdateTeamMemberRoles(teamId, userId, newRoles string) (*model.TeamMember, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.UpdateTeamMemberRoles(teamId, userId, newRoles)
api.recordTime(startTime, "UpdateTeamMemberRoles", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) CreateChannel(channel *model.Channel) (*model.Channel, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.CreateChannel(channel)
api.recordTime(startTime, "CreateChannel", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) DeleteChannel(channelId string) *model.AppError {
startTime := timePkg.Now()
_returnsA := api.apiImpl.DeleteChannel(channelId)
api.recordTime(startTime, "DeleteChannel", true)
return _returnsA
}
func (api *apiTimerLayer) GetPublicChannelsForTeam(teamId string, page, perPage int) ([]*model.Channel, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetPublicChannelsForTeam(teamId, page, perPage)
api.recordTime(startTime, "GetPublicChannelsForTeam", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetChannel(channelId string) (*model.Channel, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetChannel(channelId)
api.recordTime(startTime, "GetChannel", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetChannelByName(teamId, name string, includeDeleted bool) (*model.Channel, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetChannelByName(teamId, name, includeDeleted)
api.recordTime(startTime, "GetChannelByName", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetChannelByNameForTeamName(teamName, channelName string, includeDeleted bool) (*model.Channel, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetChannelByNameForTeamName(teamName, channelName, includeDeleted)
api.recordTime(startTime, "GetChannelByNameForTeamName", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetChannelsForTeamForUser(teamId, userId string, includeDeleted bool) ([]*model.Channel, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetChannelsForTeamForUser(teamId, userId, includeDeleted)
api.recordTime(startTime, "GetChannelsForTeamForUser", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetChannelStats(channelId string) (*model.ChannelStats, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetChannelStats(channelId)
api.recordTime(startTime, "GetChannelStats", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetDirectChannel(userId1, userId2 string) (*model.Channel, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetDirectChannel(userId1, userId2)
api.recordTime(startTime, "GetDirectChannel", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetGroupChannel(userIds []string) (*model.Channel, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetGroupChannel(userIds)
api.recordTime(startTime, "GetGroupChannel", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) UpdateChannel(channel *model.Channel) (*model.Channel, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.UpdateChannel(channel)
api.recordTime(startTime, "UpdateChannel", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) SearchChannels(teamId string, term string) ([]*model.Channel, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.SearchChannels(teamId, term)
api.recordTime(startTime, "SearchChannels", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) SearchUsers(search *model.UserSearch) ([]*model.User, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.SearchUsers(search)
api.recordTime(startTime, "SearchUsers", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) SearchPostsInTeam(teamId string, paramsList []*model.SearchParams) ([]*model.Post, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.SearchPostsInTeam(teamId, paramsList)
api.recordTime(startTime, "SearchPostsInTeam", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) AddChannelMember(channelId, userId string) (*model.ChannelMember, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.AddChannelMember(channelId, userId)
api.recordTime(startTime, "AddChannelMember", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) AddUserToChannel(channelId, userId, asUserId string) (*model.ChannelMember, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.AddUserToChannel(channelId, userId, asUserId)
api.recordTime(startTime, "AddUserToChannel", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetChannelMember(channelId, userId string) (*model.ChannelMember, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetChannelMember(channelId, userId)
api.recordTime(startTime, "GetChannelMember", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetChannelMembers(channelId string, page, perPage int) (*model.ChannelMembers, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetChannelMembers(channelId, page, perPage)
api.recordTime(startTime, "GetChannelMembers", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetChannelMembersByIds(channelId string, userIds []string) (*model.ChannelMembers, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetChannelMembersByIds(channelId, userIds)
api.recordTime(startTime, "GetChannelMembersByIds", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetChannelMembersForUser(teamId, userId string, page, perPage int) ([]*model.ChannelMember, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetChannelMembersForUser(teamId, userId, page, perPage)
api.recordTime(startTime, "GetChannelMembersForUser", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) UpdateChannelMemberRoles(channelId, userId, newRoles string) (*model.ChannelMember, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.UpdateChannelMemberRoles(channelId, userId, newRoles)
api.recordTime(startTime, "UpdateChannelMemberRoles", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) UpdateChannelMemberNotifications(channelId, userId string, notifications map[string]string) (*model.ChannelMember, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.UpdateChannelMemberNotifications(channelId, userId, notifications)
api.recordTime(startTime, "UpdateChannelMemberNotifications", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetGroup(groupId string) (*model.Group, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetGroup(groupId)
api.recordTime(startTime, "GetGroup", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetGroupByName(name string) (*model.Group, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetGroupByName(name)
api.recordTime(startTime, "GetGroupByName", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetGroupsForUser(userId string) ([]*model.Group, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetGroupsForUser(userId)
api.recordTime(startTime, "GetGroupsForUser", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) DeleteChannelMember(channelId, userId string) *model.AppError {
startTime := timePkg.Now()
_returnsA := api.apiImpl.DeleteChannelMember(channelId, userId)
api.recordTime(startTime, "DeleteChannelMember", true)
return _returnsA
}
func (api *apiTimerLayer) CreatePost(post *model.Post) (*model.Post, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.CreatePost(post)
api.recordTime(startTime, "CreatePost", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) AddReaction(reaction *model.Reaction) (*model.Reaction, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.AddReaction(reaction)
api.recordTime(startTime, "AddReaction", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) RemoveReaction(reaction *model.Reaction) *model.AppError {
startTime := timePkg.Now()
_returnsA := api.apiImpl.RemoveReaction(reaction)
api.recordTime(startTime, "RemoveReaction", true)
return _returnsA
}
func (api *apiTimerLayer) GetReactions(postId string) ([]*model.Reaction, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetReactions(postId)
api.recordTime(startTime, "GetReactions", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) SendEphemeralPost(userId string, post *model.Post) *model.Post {
startTime := timePkg.Now()
_returnsA := api.apiImpl.SendEphemeralPost(userId, post)
api.recordTime(startTime, "SendEphemeralPost", true)
return _returnsA
}
func (api *apiTimerLayer) UpdateEphemeralPost(userId string, post *model.Post) *model.Post {
startTime := timePkg.Now()
_returnsA := api.apiImpl.UpdateEphemeralPost(userId, post)
api.recordTime(startTime, "UpdateEphemeralPost", true)
return _returnsA
}
func (api *apiTimerLayer) DeleteEphemeralPost(userId, postId string) {
startTime := timePkg.Now()
api.apiImpl.DeleteEphemeralPost(userId, postId)
api.recordTime(startTime, "DeleteEphemeralPost", true)
}
func (api *apiTimerLayer) DeletePost(postId string) *model.AppError {
startTime := timePkg.Now()
_returnsA := api.apiImpl.DeletePost(postId)
api.recordTime(startTime, "DeletePost", true)
return _returnsA
}
func (api *apiTimerLayer) GetPostThread(postId string) (*model.PostList, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetPostThread(postId)
api.recordTime(startTime, "GetPostThread", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetPost(postId string) (*model.Post, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetPost(postId)
api.recordTime(startTime, "GetPost", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetPostsSince(channelId string, time int64) (*model.PostList, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetPostsSince(channelId, time)
api.recordTime(startTime, "GetPostsSince", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetPostsAfter(channelId, postId string, page, perPage int) (*model.PostList, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetPostsAfter(channelId, postId, page, perPage)
api.recordTime(startTime, "GetPostsAfter", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetPostsBefore(channelId, postId string, page, perPage int) (*model.PostList, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetPostsBefore(channelId, postId, page, perPage)
api.recordTime(startTime, "GetPostsBefore", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetPostsForChannel(channelId string, page, perPage int) (*model.PostList, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetPostsForChannel(channelId, page, perPage)
api.recordTime(startTime, "GetPostsForChannel", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetTeamStats(teamId string) (*model.TeamStats, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetTeamStats(teamId)
api.recordTime(startTime, "GetTeamStats", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) UpdatePost(post *model.Post) (*model.Post, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.UpdatePost(post)
api.recordTime(startTime, "UpdatePost", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetProfileImage(userId string) ([]byte, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetProfileImage(userId)
api.recordTime(startTime, "GetProfileImage", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) SetProfileImage(userId string, data []byte) *model.AppError {
startTime := timePkg.Now()
_returnsA := api.apiImpl.SetProfileImage(userId, data)
api.recordTime(startTime, "SetProfileImage", true)
return _returnsA
}
func (api *apiTimerLayer) GetEmojiList(sortBy string, page, perPage int) ([]*model.Emoji, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetEmojiList(sortBy, page, perPage)
api.recordTime(startTime, "GetEmojiList", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetEmojiByName(name string) (*model.Emoji, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetEmojiByName(name)
api.recordTime(startTime, "GetEmojiByName", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetEmoji(emojiId string) (*model.Emoji, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetEmoji(emojiId)
api.recordTime(startTime, "GetEmoji", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) CopyFileInfos(userId string, fileIds []string) ([]string, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.CopyFileInfos(userId, fileIds)
api.recordTime(startTime, "CopyFileInfos", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetFileInfo(fileId string) (*model.FileInfo, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetFileInfo(fileId)
api.recordTime(startTime, "GetFileInfo", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetFile(fileId string) ([]byte, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetFile(fileId)
api.recordTime(startTime, "GetFile", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetFileLink(fileId string) (string, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetFileLink(fileId)
api.recordTime(startTime, "GetFileLink", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) ReadFile(path string) ([]byte, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.ReadFile(path)
api.recordTime(startTime, "ReadFile", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetEmojiImage(emojiId string) ([]byte, string, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB, _returnsC := api.apiImpl.GetEmojiImage(emojiId)
api.recordTime(startTime, "GetEmojiImage", true)
return _returnsA, _returnsB, _returnsC
}
func (api *apiTimerLayer) UploadFile(data []byte, channelId string, filename string) (*model.FileInfo, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.UploadFile(data, channelId, filename)
api.recordTime(startTime, "UploadFile", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) OpenInteractiveDialog(dialog model.OpenDialogRequest) *model.AppError {
startTime := timePkg.Now()
_returnsA := api.apiImpl.OpenInteractiveDialog(dialog)
api.recordTime(startTime, "OpenInteractiveDialog", true)
return _returnsA
}
func (api *apiTimerLayer) GetPlugins() ([]*model.Manifest, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetPlugins()
api.recordTime(startTime, "GetPlugins", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) EnablePlugin(id string) *model.AppError {
startTime := timePkg.Now()
_returnsA := api.apiImpl.EnablePlugin(id)
api.recordTime(startTime, "EnablePlugin", true)
return _returnsA
}
func (api *apiTimerLayer) DisablePlugin(id string) *model.AppError {
startTime := timePkg.Now()
_returnsA := api.apiImpl.DisablePlugin(id)
api.recordTime(startTime, "DisablePlugin", true)
return _returnsA
}
func (api *apiTimerLayer) RemovePlugin(id string) *model.AppError {
startTime := timePkg.Now()
_returnsA := api.apiImpl.RemovePlugin(id)
api.recordTime(startTime, "RemovePlugin", true)
return _returnsA
}
func (api *apiTimerLayer) GetPluginStatus(id string) (*model.PluginStatus, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetPluginStatus(id)
api.recordTime(startTime, "GetPluginStatus", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) InstallPlugin(file io.Reader, replace bool) (*model.Manifest, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.InstallPlugin(file, replace)
api.recordTime(startTime, "InstallPlugin", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) KVSet(key string, value []byte) *model.AppError {
startTime := timePkg.Now()
_returnsA := api.apiImpl.KVSet(key, value)
api.recordTime(startTime, "KVSet", true)
return _returnsA
}
func (api *apiTimerLayer) KVCompareAndSet(key string, oldValue, newValue []byte) (bool, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.KVCompareAndSet(key, oldValue, newValue)
api.recordTime(startTime, "KVCompareAndSet", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) KVCompareAndDelete(key string, oldValue []byte) (bool, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.KVCompareAndDelete(key, oldValue)
api.recordTime(startTime, "KVCompareAndDelete", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) KVSetWithOptions(key string, value []byte, options model.PluginKVSetOptions) (bool, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.KVSetWithOptions(key, value, options)
api.recordTime(startTime, "KVSetWithOptions", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) KVSetWithExpiry(key string, value []byte, expireInSeconds int64) *model.AppError {
startTime := timePkg.Now()
_returnsA := api.apiImpl.KVSetWithExpiry(key, value, expireInSeconds)
api.recordTime(startTime, "KVSetWithExpiry", true)
return _returnsA
}
func (api *apiTimerLayer) KVGet(key string) ([]byte, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.KVGet(key)
api.recordTime(startTime, "KVGet", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) KVDelete(key string) *model.AppError {
startTime := timePkg.Now()
_returnsA := api.apiImpl.KVDelete(key)
api.recordTime(startTime, "KVDelete", true)
return _returnsA
}
func (api *apiTimerLayer) KVDeleteAll() *model.AppError {
startTime := timePkg.Now()
_returnsA := api.apiImpl.KVDeleteAll()
api.recordTime(startTime, "KVDeleteAll", true)
return _returnsA
}
func (api *apiTimerLayer) KVList(page, perPage int) ([]string, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.KVList(page, perPage)
api.recordTime(startTime, "KVList", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) PublishWebSocketEvent(event string, payload map[string]interface{}, broadcast *model.WebsocketBroadcast) {
startTime := timePkg.Now()
api.apiImpl.PublishWebSocketEvent(event, payload, broadcast)
api.recordTime(startTime, "PublishWebSocketEvent", true)
}
func (api *apiTimerLayer) HasPermissionTo(userId string, permission *model.Permission) bool {
startTime := timePkg.Now()
_returnsA := api.apiImpl.HasPermissionTo(userId, permission)
api.recordTime(startTime, "HasPermissionTo", true)
return _returnsA
}
func (api *apiTimerLayer) HasPermissionToTeam(userId, teamId string, permission *model.Permission) bool {
startTime := timePkg.Now()
_returnsA := api.apiImpl.HasPermissionToTeam(userId, teamId, permission)
api.recordTime(startTime, "HasPermissionToTeam", true)
return _returnsA
}
func (api *apiTimerLayer) HasPermissionToChannel(userId, channelId string, permission *model.Permission) bool {
startTime := timePkg.Now()
_returnsA := api.apiImpl.HasPermissionToChannel(userId, channelId, permission)
api.recordTime(startTime, "HasPermissionToChannel", true)
return _returnsA
}
func (api *apiTimerLayer) LogDebug(msg string, keyValuePairs ...interface{}) {
startTime := timePkg.Now()
api.apiImpl.LogDebug(msg, keyValuePairs...)
api.recordTime(startTime, "LogDebug", true)
}
func (api *apiTimerLayer) LogInfo(msg string, keyValuePairs ...interface{}) {
startTime := timePkg.Now()
api.apiImpl.LogInfo(msg, keyValuePairs...)
api.recordTime(startTime, "LogInfo", true)
}
func (api *apiTimerLayer) LogError(msg string, keyValuePairs ...interface{}) {
startTime := timePkg.Now()
api.apiImpl.LogError(msg, keyValuePairs...)
api.recordTime(startTime, "LogError", true)
}
func (api *apiTimerLayer) LogWarn(msg string, keyValuePairs ...interface{}) {
startTime := timePkg.Now()
api.apiImpl.LogWarn(msg, keyValuePairs...)
api.recordTime(startTime, "LogWarn", true)
}
func (api *apiTimerLayer) SendMail(to, subject, htmlBody string) *model.AppError {
startTime := timePkg.Now()
_returnsA := api.apiImpl.SendMail(to, subject, htmlBody)
api.recordTime(startTime, "SendMail", true)
return _returnsA
}
func (api *apiTimerLayer) CreateBot(bot *model.Bot) (*model.Bot, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.CreateBot(bot)
api.recordTime(startTime, "CreateBot", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) PatchBot(botUserId string, botPatch *model.BotPatch) (*model.Bot, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.PatchBot(botUserId, botPatch)
api.recordTime(startTime, "PatchBot", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetBot(botUserId string, includeDeleted bool) (*model.Bot, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetBot(botUserId, includeDeleted)
api.recordTime(startTime, "GetBot", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) GetBots(options *model.BotGetOptions) ([]*model.Bot, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetBots(options)
api.recordTime(startTime, "GetBots", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) UpdateBotActive(botUserId string, active bool) (*model.Bot, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.UpdateBotActive(botUserId, active)
api.recordTime(startTime, "UpdateBotActive", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) PermanentDeleteBot(botUserId string) *model.AppError {
startTime := timePkg.Now()
_returnsA := api.apiImpl.PermanentDeleteBot(botUserId)
api.recordTime(startTime, "PermanentDeleteBot", true)
return _returnsA
}
func (api *apiTimerLayer) GetBotIconImage(botUserId string) ([]byte, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := api.apiImpl.GetBotIconImage(botUserId)
api.recordTime(startTime, "GetBotIconImage", true)
return _returnsA, _returnsB
}
func (api *apiTimerLayer) SetBotIconImage(botUserId string, data []byte) *model.AppError {
startTime := timePkg.Now()
_returnsA := api.apiImpl.SetBotIconImage(botUserId, data)
api.recordTime(startTime, "SetBotIconImage", true)
return _returnsA
}
func (api *apiTimerLayer) DeleteBotIconImage(botUserId string) *model.AppError {
startTime := timePkg.Now()
_returnsA := api.apiImpl.DeleteBotIconImage(botUserId)
api.recordTime(startTime, "DeleteBotIconImage", true)
return _returnsA
}
func (api *apiTimerLayer) PluginHTTP(request *http.Request) *http.Response {
startTime := timePkg.Now()
_returnsA := api.apiImpl.PluginHTTP(request)
api.recordTime(startTime, "PluginHTTP", true)
return _returnsA
}

Просмотреть файл

@@ -108,7 +108,7 @@ var _ plugin.Plugin = &hooksPlugin{}
var _ Hooks = &hooksRPCClient{}
//
// Below are specal cases for hooks or APIs that can not be auto generated
// Below are special cases for hooks or APIs that can not be auto generated
//
func (g *hooksRPCClient) Implemented() (impl []string, err error) {

Просмотреть файл

@@ -12,6 +12,7 @@ import (
"sync"
"time"
"github.com/mattermost/mattermost-server/v5/einterfaces"
"github.com/mattermost/mattermost-server/v5/mlog"
"github.com/mattermost/mattermost-server/v5/model"
"github.com/mattermost/mattermost-server/v5/utils"
@@ -52,6 +53,7 @@ type Environment struct {
registeredPlugins sync.Map
pluginHealthCheckJob *PluginHealthCheckJob
logger *mlog.Logger
metrics einterfaces.MetricsInterface
newAPIImpl apiImplCreatorFunc
pluginDir string
webappPluginDir string
@@ -59,9 +61,10 @@ type Environment struct {
prepackagedPluginsLock sync.RWMutex
}
func NewEnvironment(newAPIImpl apiImplCreatorFunc, pluginDir string, webappPluginDir string, logger *mlog.Logger) (*Environment, error) {
func NewEnvironment(newAPIImpl apiImplCreatorFunc, pluginDir string, webappPluginDir string, logger *mlog.Logger, metrics einterfaces.MetricsInterface) (*Environment, error) {
return &Environment{
logger: logger,
metrics: metrics,
newAPIImpl: newAPIImpl,
pluginDir: pluginDir,
webappPluginDir: webappPluginDir,
@@ -267,7 +270,7 @@ func (env *Environment) Activate(id string) (manifest *model.Manifest, activated
}
if pluginInfo.Manifest.HasServer() {
sup, err := newSupervisor(pluginInfo, env.logger, env.newAPIImpl(pluginInfo.Manifest))
sup, err := newSupervisor(pluginInfo, env.newAPIImpl(pluginInfo.Manifest), env.logger, env.metrics)
if err != nil {
return nil, false, errors.Wrapf(err, "unable to start plugin: %v", id)
}
@@ -454,6 +457,8 @@ func (env *Environment) HooksForPlugin(id string) (Hooks, error) {
// If hookRunnerFunc returns false, iteration will not continue. The iteration order among active
// plugins is not specified.
func (env *Environment) RunMultiPluginHook(hookRunnerFunc func(hooks Hooks) bool, hookId int) {
startTime := time.Now()
env.registeredPlugins.Range(func(key, value interface{}) bool {
rp := value.(registeredPlugin)
@@ -461,8 +466,21 @@ func (env *Environment) RunMultiPluginHook(hookRunnerFunc func(hooks Hooks) bool
return true
}
return hookRunnerFunc(rp.supervisor.Hooks())
hookStartTime := time.Now()
result := hookRunnerFunc(rp.supervisor.Hooks())
if env.metrics != nil {
elapsedTime := float64(time.Since(hookStartTime)) / float64(time.Second)
env.metrics.ObservePluginMultiHookIterationDuration(rp.BundleInfo.Manifest.Id, elapsedTime)
}
return result
})
if env.metrics != nil {
elapsedTime := float64(time.Since(startTime)) / float64(time.Second)
env.metrics.ObservePluginMultiHookDuration(elapsedTime)
}
}
// SetPrepackagedPlugins saves prepackaged plugins in the environment.

Просмотреть файл

@@ -58,7 +58,7 @@ func testPluginHealthCheckSuccess(t *testing.T) {
EnableFile: false,
})
supervisor, err := newSupervisor(bundle, log, nil)
supervisor, err := newSupervisor(bundle, nil, log, nil)
require.Nil(t, err)
require.NotNil(t, supervisor)
@@ -104,7 +104,7 @@ func testPluginHealthCheckPanic(t *testing.T) {
EnableFile: false,
})
supervisor, err := newSupervisor(bundle, log, nil)
supervisor, err := newSupervisor(bundle, nil, log, nil)
require.Nil(t, err)
require.NotNil(t, supervisor)

152
plugin/hooks_timer_layer_generated.go Обычный файл
Просмотреть файл

@@ -0,0 +1,152 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
// Code generated by "make pluginapi"
// DO NOT EDIT
package plugin
import (
"io"
"net/http"
timePkg "time"
"github.com/mattermost/mattermost-server/v5/einterfaces"
"github.com/mattermost/mattermost-server/v5/model"
)
type hooksTimerLayer struct {
pluginID string
hooksImpl Hooks
metrics einterfaces.MetricsInterface
}
func (hooks *hooksTimerLayer) recordTime(startTime timePkg.Time, name string, success bool) {
if hooks.metrics != nil {
elapsedTime := float64(timePkg.Since(startTime)) / float64(timePkg.Second)
hooks.metrics.ObservePluginHookDuration(hooks.pluginID, name, success, elapsedTime)
}
}
func (hooks *hooksTimerLayer) OnActivate() error {
startTime := timePkg.Now()
_returnsA := hooks.hooksImpl.OnActivate()
hooks.recordTime(startTime, "OnActivate", true)
return _returnsA
}
func (hooks *hooksTimerLayer) Implemented() ([]string, error) {
startTime := timePkg.Now()
_returnsA, _returnsB := hooks.hooksImpl.Implemented()
hooks.recordTime(startTime, "Implemented", true)
return _returnsA, _returnsB
}
func (hooks *hooksTimerLayer) OnDeactivate() error {
startTime := timePkg.Now()
_returnsA := hooks.hooksImpl.OnDeactivate()
hooks.recordTime(startTime, "OnDeactivate", true)
return _returnsA
}
func (hooks *hooksTimerLayer) OnConfigurationChange() error {
startTime := timePkg.Now()
_returnsA := hooks.hooksImpl.OnConfigurationChange()
hooks.recordTime(startTime, "OnConfigurationChange", true)
return _returnsA
}
func (hooks *hooksTimerLayer) ServeHTTP(c *Context, w http.ResponseWriter, r *http.Request) {
startTime := timePkg.Now()
hooks.hooksImpl.ServeHTTP(c, w, r)
hooks.recordTime(startTime, "ServeHTTP", true)
}
func (hooks *hooksTimerLayer) ExecuteCommand(c *Context, args *model.CommandArgs) (*model.CommandResponse, *model.AppError) {
startTime := timePkg.Now()
_returnsA, _returnsB := hooks.hooksImpl.ExecuteCommand(c, args)
hooks.recordTime(startTime, "ExecuteCommand", true)
return _returnsA, _returnsB
}
func (hooks *hooksTimerLayer) UserHasBeenCreated(c *Context, user *model.User) {
startTime := timePkg.Now()
hooks.hooksImpl.UserHasBeenCreated(c, user)
hooks.recordTime(startTime, "UserHasBeenCreated", true)
}
func (hooks *hooksTimerLayer) UserWillLogIn(c *Context, user *model.User) string {
startTime := timePkg.Now()
_returnsA := hooks.hooksImpl.UserWillLogIn(c, user)
hooks.recordTime(startTime, "UserWillLogIn", true)
return _returnsA
}
func (hooks *hooksTimerLayer) UserHasLoggedIn(c *Context, user *model.User) {
startTime := timePkg.Now()
hooks.hooksImpl.UserHasLoggedIn(c, user)
hooks.recordTime(startTime, "UserHasLoggedIn", true)
}
func (hooks *hooksTimerLayer) MessageWillBePosted(c *Context, post *model.Post) (*model.Post, string) {
startTime := timePkg.Now()
_returnsA, _returnsB := hooks.hooksImpl.MessageWillBePosted(c, post)
hooks.recordTime(startTime, "MessageWillBePosted", true)
return _returnsA, _returnsB
}
func (hooks *hooksTimerLayer) MessageWillBeUpdated(c *Context, newPost, oldPost *model.Post) (*model.Post, string) {
startTime := timePkg.Now()
_returnsA, _returnsB := hooks.hooksImpl.MessageWillBeUpdated(c, newPost, oldPost)
hooks.recordTime(startTime, "MessageWillBeUpdated", true)
return _returnsA, _returnsB
}
func (hooks *hooksTimerLayer) MessageHasBeenPosted(c *Context, post *model.Post) {
startTime := timePkg.Now()
hooks.hooksImpl.MessageHasBeenPosted(c, post)
hooks.recordTime(startTime, "MessageHasBeenPosted", true)
}
func (hooks *hooksTimerLayer) MessageHasBeenUpdated(c *Context, newPost, oldPost *model.Post) {
startTime := timePkg.Now()
hooks.hooksImpl.MessageHasBeenUpdated(c, newPost, oldPost)
hooks.recordTime(startTime, "MessageHasBeenUpdated", true)
}
func (hooks *hooksTimerLayer) ChannelHasBeenCreated(c *Context, channel *model.Channel) {
startTime := timePkg.Now()
hooks.hooksImpl.ChannelHasBeenCreated(c, channel)
hooks.recordTime(startTime, "ChannelHasBeenCreated", true)
}
func (hooks *hooksTimerLayer) UserHasJoinedChannel(c *Context, channelMember *model.ChannelMember, actor *model.User) {
startTime := timePkg.Now()
hooks.hooksImpl.UserHasJoinedChannel(c, channelMember, actor)
hooks.recordTime(startTime, "UserHasJoinedChannel", true)
}
func (hooks *hooksTimerLayer) UserHasLeftChannel(c *Context, channelMember *model.ChannelMember, actor *model.User) {
startTime := timePkg.Now()
hooks.hooksImpl.UserHasLeftChannel(c, channelMember, actor)
hooks.recordTime(startTime, "UserHasLeftChannel", true)
}
func (hooks *hooksTimerLayer) UserHasJoinedTeam(c *Context, teamMember *model.TeamMember, actor *model.User) {
startTime := timePkg.Now()
hooks.hooksImpl.UserHasJoinedTeam(c, teamMember, actor)
hooks.recordTime(startTime, "UserHasJoinedTeam", true)
}
func (hooks *hooksTimerLayer) UserHasLeftTeam(c *Context, teamMember *model.TeamMember, actor *model.User) {
startTime := timePkg.Now()
hooks.hooksImpl.UserHasLeftTeam(c, teamMember, actor)
hooks.recordTime(startTime, "UserHasLeftTeam", true)
}
func (hooks *hooksTimerLayer) FileWillBeUploaded(c *Context, info *model.FileInfo, file io.Reader, output io.Writer) (*model.FileInfo, string) {
startTime := timePkg.Now()
_returnsA, _returnsB := hooks.hooksImpl.FileWillBeUploaded(c, info, file, output)
hooks.recordTime(startTime, "FileWillBeUploaded", true)
return _returnsA, _returnsB
}

Просмотреть файл

@@ -12,13 +12,13 @@ import (
"go/token"
"io/ioutil"
"log"
"os"
"os/exec"
"path/filepath"
"strings"
"text/template"
"github.com/pkg/errors"
"golang.org/x/tools/imports"
)
type IHookEntry struct {
@@ -55,14 +55,18 @@ func FieldListToFuncList(fieldList *ast.FieldList, fileset *token.FileSet) strin
return "(" + strings.Join(result, ", ") + ")"
}
func FieldListToNames(fieldList *ast.FieldList, fileset *token.FileSet) string {
func FieldListToNames(fieldList *ast.FieldList, fileset *token.FileSet, variadicForm bool) string {
result := []string{}
if fieldList == nil || len(fieldList.List) == 0 {
return ""
}
for _, field := range fieldList.List {
for _, name := range field.Names {
result = append(result, name.Name)
paramName := name.Name
if _, ok := field.Type.(*ast.Ellipsis); ok && variadicForm {
paramName = fmt.Sprintf("%s...", paramName)
}
result = append(result, paramName)
}
}
@@ -314,6 +318,90 @@ func (s *apiRPCServer) {{.Name}}(args *{{.Name | obscure}}Args, returns *{{.Name
{{end}}
`
var apiTimerLayerTemplate = `// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
// Code generated by "make pluginapi"
// DO NOT EDIT
package plugin
import (
"io"
"net/http"
timePkg "time"
"github.com/mattermost/mattermost-server/v5/einterfaces"
"github.com/mattermost/mattermost-server/v5/model"
)
type apiTimerLayer struct {
pluginID string
apiImpl API
metrics einterfaces.MetricsInterface
}
func (api *apiTimerLayer) recordTime(startTime timePkg.Time, name string, success bool) {
if api.metrics != nil {
elapsedTime := float64(timePkg.Since(startTime)) / float64(timePkg.Second)
api.metrics.ObservePluginApiDuration(api.pluginID, name, success, elapsedTime)
}
}
{{range .APIMethods}}
func (api *apiTimerLayer) {{.Name}}{{funcStyle .Params}} {{funcStyle .Return}} {
startTime := timePkg.Now()
{{ if .Return }} {{destruct "_returns" .Return}} := {{ end }} api.apiImpl.{{.Name}}({{valuesOnly .Params}})
api.recordTime(startTime, "{{.Name}}", true)
{{ if .Return }} return {{destruct "_returns" .Return}} {{ end -}}
}
{{end}}
`
var hooksTimerLayerTemplate = `// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
// Code generated by "make pluginapi"
// DO NOT EDIT
package plugin
import (
"io"
"net/http"
timePkg "time"
"github.com/mattermost/mattermost-server/v5/einterfaces"
"github.com/mattermost/mattermost-server/v5/model"
)
type hooksTimerLayer struct {
pluginID string
hooksImpl Hooks
metrics einterfaces.MetricsInterface
}
func (hooks *hooksTimerLayer) recordTime(startTime timePkg.Time, name string, success bool) {
if hooks.metrics != nil {
elapsedTime := float64(timePkg.Since(startTime)) / float64(timePkg.Second)
hooks.metrics.ObservePluginHookDuration(hooks.pluginID, name, success, elapsedTime)
}
}
{{range .HooksMethods}}
func (hooks *hooksTimerLayer) {{.Name}}{{funcStyle .Params}} {{funcStyle .Return}} {
startTime := timePkg.Now()
{{ if .Return }} {{destruct "_returns" .Return}} := {{ end }} hooks.hooksImpl.{{.Name}}({{valuesOnly .Params}})
hooks.recordTime(startTime, "{{.Name}}", true)
{{ if .Return }} return {{destruct "_returns" .Return}} {{end -}}
}
{{end}}
`
type MethodParams struct {
Name string
Params *ast.FieldList
@@ -325,11 +413,11 @@ type HooksTemplateParams struct {
APIMethods []MethodParams
}
func generateGlue(info *PluginInterfaceInfo) {
func generateHooksGlue(info *PluginInterfaceInfo) {
templateFunctions := map[string]interface{}{
"funcStyle": func(fields *ast.FieldList) string { return FieldListToFuncList(fields, info.FileSet) },
"structStyle": func(fields *ast.FieldList) string { return FieldListToStructList(fields, info.FileSet) },
"valuesOnly": func(fields *ast.FieldList) string { return FieldListToNames(fields, info.FileSet) },
"valuesOnly": func(fields *ast.FieldList) string { return FieldListToNames(fields, info.FileSet, false) },
"encodeErrors": func(structPrefix string, fields *ast.FieldList) string {
return FieldListToEncodedErrors(structPrefix, fields, info.FileSet)
},
@@ -364,20 +452,68 @@ func generateGlue(info *PluginInterfaceInfo) {
templateResult := &bytes.Buffer{}
hooksTemplate.Execute(templateResult, &templateParams)
importsBuffer := &bytes.Buffer{}
cmd := exec.Command("goimports")
cmd.Stdin = templateResult
cmd.Stdout = importsBuffer
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
formatted, err := imports.Process("", templateResult.Bytes(), nil)
if err != nil {
panic(err)
}
if err := ioutil.WriteFile(filepath.Join(getPluginPackageDir(), "client_rpc_generated.go"), importsBuffer.Bytes(), 0664); err != nil {
if err := ioutil.WriteFile(filepath.Join(getPluginPackageDir(), "client_rpc_generated.go"), formatted, 0664); err != nil {
panic(err)
}
}
func generatePluginTimerLayer(info *PluginInterfaceInfo) {
templateFunctions := map[string]interface{}{
"funcStyle": func(fields *ast.FieldList) string { return FieldListToFuncList(fields, info.FileSet) },
"structStyle": func(fields *ast.FieldList) string { return FieldListToStructList(fields, info.FileSet) },
"valuesOnly": func(fields *ast.FieldList) string { return FieldListToNames(fields, info.FileSet, true) },
"destruct": func(structPrefix string, fields *ast.FieldList) string {
return FieldListDestruct(structPrefix, fields, info.FileSet)
},
}
// Prepare template params
templateParams := HooksTemplateParams{}
for _, hook := range info.Hooks {
templateParams.HooksMethods = append(templateParams.HooksMethods, MethodParams{
Name: hook.FuncName,
Params: hook.Args,
Return: hook.Results,
})
}
for _, api := range info.API {
templateParams.APIMethods = append(templateParams.APIMethods, MethodParams{
Name: api.FuncName,
Params: api.Args,
Return: api.Results,
})
}
pluginTemplates := map[string]string{
"api_timer_layer_generated.go": apiTimerLayerTemplate,
"hooks_timer_layer_generated.go": hooksTimerLayerTemplate,
}
for fileName, presetTemplate := range pluginTemplates {
parsedTemplate, err := template.New("hooks").Funcs(templateFunctions).Parse(presetTemplate)
if err != nil {
panic(err)
}
templateResult := &bytes.Buffer{}
parsedTemplate.Execute(templateResult, &templateParams)
formatted, err := imports.Process("", templateResult.Bytes(), nil)
if err != nil {
panic(err)
}
if err := ioutil.WriteFile(filepath.Join(getPluginPackageDir(), fileName), formatted, 0664); err != nil {
panic(err)
}
}
}
func getPluginPackageDir() string {
dirs, err := goList("github.com/mattermost/mattermost-server/v5/plugin")
if err != nil {
@@ -435,13 +571,18 @@ func removeExcluded(info *PluginInterfaceInfo) *PluginInterfaceInfo {
func main() {
pluginPackageDir := getPluginPackageDir()
log.Println("Generating plugin glue")
info, err := getPluginInfo(pluginPackageDir)
log.Println("Generating plugin hooks glue")
forRPC, err := getPluginInfo(pluginPackageDir)
if err != nil {
fmt.Println("Unable to get plugin info: " + err.Error())
}
generateHooksGlue(removeExcluded(forRPC))
info = removeExcluded(info)
generateGlue(info)
// Generate plugin timer layers
log.Println("Generating plugin timer glue")
forPlugins, err := getPluginInfo(pluginPackageDir)
if err != nil {
fmt.Println("Unable to get plugin info: " + err.Error())
}
generatePluginTimerLayer(forPlugins)
}

Просмотреть файл

@@ -13,6 +13,7 @@ import (
"time"
plugin "github.com/hashicorp/go-plugin"
"github.com/mattermost/mattermost-server/v5/einterfaces"
"github.com/mattermost/mattermost-server/v5/mlog"
"github.com/mattermost/mattermost-server/v5/model"
)
@@ -25,7 +26,7 @@ type supervisor struct {
pid int
}
func newSupervisor(pluginInfo *model.BundleInfo, parentLogger *mlog.Logger, apiImpl API) (retSupervisor *supervisor, retErr error) {
func newSupervisor(pluginInfo *model.BundleInfo, apiImpl API, parentLogger *mlog.Logger, metrics einterfaces.MetricsInterface) (retSupervisor *supervisor, retErr error) {
sup := supervisor{}
defer func() {
if retErr != nil {
@@ -43,7 +44,7 @@ func newSupervisor(pluginInfo *model.BundleInfo, parentLogger *mlog.Logger, apiI
pluginMap := map[string]plugin.Plugin{
"hooks": &hooksPlugin{
log: wrappedLogger,
apiImpl: apiImpl,
apiImpl: &apiTimerLayer{pluginInfo.Manifest.Id, apiImpl, metrics},
},
}
@@ -80,7 +81,7 @@ func newSupervisor(pluginInfo *model.BundleInfo, parentLogger *mlog.Logger, apiI
return nil, err
}
sup.hooks = raw.(Hooks)
sup.hooks = &hooksTimerLayer{pluginInfo.Manifest.Id, raw.(Hooks), metrics}
impl, err := sup.hooks.Implemented()
if err != nil {

Просмотреть файл

@@ -40,7 +40,7 @@ func testSupervisorInvalidExecutablePath(t *testing.T) {
ConsoleLevel: "error",
EnableFile: false,
})
supervisor, err := newSupervisor(bundle, log, nil)
supervisor, err := newSupervisor(bundle, nil, log, nil)
assert.Nil(t, supervisor)
assert.Error(t, err)
}
@@ -59,7 +59,7 @@ func testSupervisorNonExistentExecutablePath(t *testing.T) {
ConsoleLevel: "error",
EnableFile: false,
})
supervisor, err := newSupervisor(bundle, log, nil)
supervisor, err := newSupervisor(bundle, nil, log, nil)
require.Error(t, err)
require.Nil(t, supervisor)
}
@@ -89,7 +89,7 @@ func testSupervisorStartTimeout(t *testing.T) {
ConsoleLevel: "error",
EnableFile: false,
})
supervisor, err := newSupervisor(bundle, log, nil)
supervisor, err := newSupervisor(bundle, nil, log, nil)
require.Error(t, err)
require.Nil(t, supervisor)
}