Documentation ¶
Index ¶
- Constants
- Variables
- func ActivationThresholds(policy *configpb.BugManagementPolicy) []*configpb.ImpactMetricThreshold
- func ActivePolicies(state *bugspb.BugManagementState) map[PolicyID]struct{}
- func ActivePoliciesPendingNotification(state *bugspb.BugManagementState) map[PolicyID]struct{}
- func BugFiledHelpURL(uiBaseURL string) string
- func BugReopenedHelpURL(uiBaseURL string) string
- func BugVerifiedHelpURL(uiBaseURL string) string
- func ComponentSelectionHelpURL(uiBaseURL string) string
- func EnsureTimeToDeadline(ctx context.Context, d time.Duration) error
- func FeedbackURL(uiBaseURL string) string
- func GenerateBugSummary(title string) string
- func InflateThreshold(t []*configpb.ImpactMetricThreshold, inflationPercent int64) []*configpb.ImpactMetricThreshold
- func PolicyActivatedHelpURL(uiBaseURL string) string
- func PriorityUpdatedHelpURL(uiBaseURL string) string
- func RuleForBuganizerBugURL(uiBaseURL string, issueID int64) string
- func RuleForMonorailBugURL(uiBaseURL string, issueID string) string
- func RuleURL(uiBaseURL, project, ruleID string) string
- func Shorten(ctx context.Context, d time.Duration) (context.Context, context.CancelFunc)
- func UpdatePolicyActivations(state *bugspb.BugManagementState, policies []*configpb.BugManagementPolicy, ...) (updatedState *bugspb.BugManagementState, changed bool)
- type BugChange
- type BugCreateRequest
- type BugCreateResponse
- type BugID
- type BugOptions
- type BugUpdateRequest
- type BugUpdateResponse
- type ClusterMetrics
- type Commentary
- type DuplicateBugDetails
- type MetricValues
- type PolicyApplyer
- func (p PolicyApplyer) NeedsPriorityOrVerifiedUpdate(opts BugOptions) bool
- func (p PolicyApplyer) NewIssueDescription(description *clustering.ClusterDescription, ...) string
- func (p PolicyApplyer) PoliciesByIDs(policyIDs map[PolicyID]struct{}) []*configpb.BugManagementPolicy
- func (p PolicyApplyer) PolicyActivatedComment(policyID PolicyID, uiBaseURL string, input TemplateInput) (string, error)
- func (p PolicyApplyer) PolicyByID(policyID PolicyID) *configpb.BugManagementPolicy
- func (p PolicyApplyer) PreparePriorityAndVerifiedChange(opts BugOptions, uiBaseURL string) (BugChange, error)
- func (p PolicyApplyer) RecommendedPriorityAndVerified(activePolicyIDs map[PolicyID]struct{}) (priority configpb.BuganizerPriority, verified bool)
- func (p PolicyApplyer) SortPolicyIDsByPriorityDescending(policyIDs map[PolicyID]struct{}) []PolicyID
- type PolicyID
- type Template
- type TemplateBugID
- type TemplateInput
- type UpdateDuplicateSourceRequest
Constants ¶
const ( SourceBugRuleUpdatedTemplate = `Because this bug was merged into another bug, LUCI Analysis has` + ` merged the failure association rule for this bug into the rule for the canonical bug. See failure impact and configure the failure association rule for the canoncial bug at: %s` LinkTemplate = `See failure impact and configure the failure association rule for this bug at: %s` NoPermissionTemplate = `` /* 138-byte string literal not displayed */ )
const BuganizerSystem = "buganizer"
BuganizerSystem is the name of the buganizer bug tracker system.
const MonorailSystem = "monorail"
MonorailSystem is the name of the monorail bug tracker system.
Variables ¶
var ( // BugsCreatedCounter is the metric that counts the number of bugs // created by LUCI Analysis, by project and bug-filing system. BugsCreatedCounter = metric.NewCounter("analysis/bug_updater/bugs_created", "The number of bugs created by auto-bug filing, "+ "by LUCI Project and bug-filing system.", &types.MetricMetadata{ Units: "bugs", }, field.String("project"), field.String("bug_system"), ) BugsUpdatedCounter = metric.NewCounter("analysis/bug_updater/bugs_updated", "The number of bugs updated by auto-bug filing, "+ "by LUCI Project and bug-filing system.", &types.MetricMetadata{ Units: "bugs", }, field.String("project"), field.String("bug_system")) )
var BuganizerBugIDRe = regexp.MustCompile(`^([1-9][0-9]*)$`)
BuganizerBugIDRe matches identifiers of buganizer bugs (excluding the b/), like 1234567890.
var MonorailBugIDRe = regexp.MustCompile(`^([a-z0-9\-_]+)/([1-9][0-9]*)$`)
MonorailBugIDRe matches identifiers of monorail bugs, like "{monorail_project}/{numeric_id}".
Functions ¶
func ActivationThresholds ¶
func ActivationThresholds(policy *configpb.BugManagementPolicy) []*configpb.ImpactMetricThreshold
ActivationThresholds returns the set of thresholds that result in a policy activating. The returned thresholds should be treated as an 'OR', i.e. any of the given metric thresholds can result in a policy activating.
func ActivePolicies ¶
func ActivePolicies(state *bugspb.BugManagementState) map[PolicyID]struct{}
ActivePolicies returns the set of policy IDs active in the given bug management state.
func ActivePoliciesPendingNotification ¶
func ActivePoliciesPendingNotification(state *bugspb.BugManagementState) map[PolicyID]struct{}
ActivePoliciesPendingNotification returns the set of policies which are active but for which activation has not been notified to the bug.
func BugFiledHelpURL ¶
func BugReopenedHelpURL ¶
func BugVerifiedHelpURL ¶
func EnsureTimeToDeadline ¶
EnsureTimeToDeadline ensures there is at least duration `d` available before the context deadline. If not, it returns an error. It also returns an error if the context is already cancelled.
func FeedbackURL ¶
func GenerateBugSummary ¶
GenerateBugSummary generates a unified form of bug summary with a sanitized title.
func InflateThreshold ¶
func InflateThreshold(t []*configpb.ImpactMetricThreshold, inflationPercent int64) []*configpb.ImpactMetricThreshold
InflateThreshold inflates or deflates impact thresholds by the given factor. This method is provided to help implement hysteresis. inflationPercent can be positive or negative (or zero), and is interpreted as follows: - If inflationPercent is positive, the new threshold is (threshold * (1 + (inflationPercent/100))) - If inflationPercent is negative, the new threshold used is (threshold / (1 + (-inflationPercent/100)) i.e. inflationPercent of +100 would result in a threshold that is 200% the original threshold being used, inflationPercent of -100 would result in a threshold that is 50% of the original. To avoid unintended effects such as 1 being inflated down to 0, inflation can never make a zero number non-zero or a non-zero number zero.
func PolicyActivatedHelpURL ¶
func PriorityUpdatedHelpURL ¶
func RuleForBuganizerBugURL ¶
RuleForBuganizerBugURL returns the link to the rule for the given buganizer bug. uiBaseURL is the base URL of the LUCI Analysis UI, excluding trailing slash.
func RuleForMonorailBugURL ¶
RuleForMonorailBugURL returns the link to the rule for the given monorail bug. issueID is of the form "<monorail-project>/<id>", e.g. "chromium/100". uiBaseURL is the base URL of the LUCI Analysis UI, excluding trailing slash.
func Shorten ¶
Shorten returns a derived context with its deadline shortened by d. The context can also be cancelled with the returned cancel function.
func UpdatePolicyActivations ¶
func UpdatePolicyActivations(state *bugspb.BugManagementState, policies []*configpb.BugManagementPolicy, clusterMetrics ClusterMetrics, now time.Time) (updatedState *bugspb.BugManagementState, changed bool)
UpdatePolicyActivations updates the active policies for a failure association rule, given its current state, configured policies and cluster metrics.
If no reliable cluster metrics are available, nil should be passed as clusterMetrics and only pruning of old policies/creation of new state entries for new policies will occur.
If any updates need to be made, changed will be true and a new *bugspb.BugManagementState is returned. Otherwise, the original state is returned.
Types ¶
type BugChange ¶
type BugChange struct { // The human-readable justification of the change. // This will be blank if no change is proposed. Justification Commentary // Whether the bug priority should be updated. UpdatePriority bool // The new bug priority. Priority configpb.BuganizerPriority // Whether the bug verified status should be changed. UpdateVerified bool // Whether the bug should be verified now. ShouldBeVerified bool }
type BugCreateRequest ¶
type BugCreateRequest struct { // The ID of the rule that is in the process of being created. RuleID string // Description is the human-readable description of the cluster. Description *clustering.ClusterDescription // The monorail components (if any) to use. // This value is ignored for Buganizer. MonorailComponents []string // The buganizer component id (if any) to use. // This value is ignored for Monorail. BuganizerComponent int64 // The bug management policies which activated for this // cluster and are triggering the filing of this bug. ActivePolicyIDs map[PolicyID]struct{} }
BugCreateRequest captures a request to a bug filing system to file a new bug for a suggested cluster.
type BugCreateResponse ¶
type BugCreateResponse struct { // The error encountered creating the bug. Note that this error // may have occured after a partial success; for example, we may have // successfully created a bug but failed on a subequent RPC to // posting comments for the policies that have activated. // // In the case of partial success, ID shall still be set to allow // creation of the rule. This avoids duplicate bugs being created // from repeated failed attempts to completely create a bug. // The policies for which comments could not be posted will // not be set to true under BugManagementState.Policies[<policyID>].ActivationNotified // so that these are retried as part of the bug update process. Error error // Simulated indicates whether the bug creation was simulated, // i.e. did not actually occur. If this is set, the returned // bug ID should be ignored. Simulated bool // The system-specific bug ID for the bug that was created. // See BugID.ID. // If we failed to create a bug, set to "" (empty). ID string // The set of policy IDs for which activation was successfully notified. // This may differ from the list in the request in the case of // partial or total failure to create the bug. // If a policy ID is included here, // BugManagementState.Policies[<policyID>].ActivationNotified will be // set to true on the rule. PolicyActivationsNotified map[PolicyID]struct{} }
type BugID ¶
type BugID struct { // System is the bug tracking system of the bug. This is either // "monorail" or "buganizer". System string `json:"system"` // ID is the bug tracking system-specific identity of the bug. // For monorail, the scheme is {project}/{numeric_id}, for // buganizer the scheme is {numeric_id}. ID string `json:"id"` }
BugID represents the identity of a bug managed by LUCI Analysis.
func (*BugID) MonorailProjectAndID ¶
MonorailID returns the monorail project and ID of the given bug. If the bug is not a monorail bug or is invalid, an error is returned.
type BugOptions ¶
type BugOptions struct { // The current bug management state. State *bugspb.BugManagementState // Whether we are managing the priority of the bug. IsManagingPriority bool // The current priority of the bug. ExistingPriority configpb.BuganizerPriority // Whether the bug is currently verified. ExistingVerified bool }
type BugUpdateRequest ¶
type BugUpdateRequest struct { // The bug to update. Bug BugID // Whether the user enabled priority updates and auto-closure for the bug. // If this if false, the BugUpdateRequest is only made to determine if the // bug is the duplicate of another bug and if the rule should be archived. IsManagingBug bool // Whether the user enabled priority updates for the Bug. // If this is false, the bug priority will not change. IsManagingBugPriority bool // The time when the field `IsManagingBugPriority` was last updated. // This is used to determine whether or not we should make priority updates by // if the user manually took control of the bug priority before // or after automatic priority updates were (re-)enabled. IsManagingBugPriorityLastUpdated time.Time // The identity of the rule associated with the bug. RuleID string // The bug management state of the rule. Only set if policy-based bug // management should be used; see Metrics field otherwise. BugManagementState *bugspb.BugManagementState }
type BugUpdateResponse ¶
type BugUpdateResponse struct { // Error is the error encountered updating this specific bug (if any). // // Even if an error is set here, partial success is possible and // actions may have been taken on the bug which require corresponding // rule updates. As such, even if an error is set here, the consumer // of this response must action the rule updates specified by // DisableRulePriorityUpdates, RuleAssociationNotified and // PolicyActivationsNotified to avoid us unnecessarily repeating // these actions on the bug the next time bug management runs. // // Similarly, even when an error occurs, the producer of this response // still has an an obligation to set DisableRulePriorityUpdates, // RuleAssociationNotified and PolicyActivationsNotified correctly. // In case of complete failures, leaving DisableRulePriorityUpdates // and PolicyActivationsNotified set to false, and PolicyActivationsNotified // empty will satisfy this requirement. Error error // IsDuplicate is set if the bug is a duplicate of another. // Set to true to trigger updating/merging failure association rules. // // If we could not fetch the bug for some reason and cannot determine // if the bug should be archived, this must be set to false. IsDuplicate bool // IsDuplicateAndAssigned is set if the bug is assigned to a user. // Only set if IsDuplicate is set. IsDuplicateAndAssigned bool // ShouldArchive indicates if the rule for this bug should be archived. // This should be set if: // - The bug is managed by LUCI Analysis (IsManagingBug = true) and it has // been marked as Closed (verified) by LUCI Analysis for the last 30 // days. // - The bug is managed by the user (IsManagingBug = false), and the // bug has been closed for the last 30 days. // // If we could not fetch the bug for some reason and cannot determine // if the bug should be archived, this must be set to false. ShouldArchive bool // DisableRulePriorityUpdates indicates that the rules `IsManagingBugUpdates` // field should be disabled. // This is set when a user manually takes control of the priority of a bug. // // If we could not fetch the bug for some reason and cannot determine // if the user has taken control of the bug, this must be set to false. DisableRulePriorityUpdates bool // Whether the association between the rule and the bug was notified. // Set to true to set BugManagementState.RuleAssociationNotified. RuleAssociationNotified bool // The set of policy IDs for which activation was notified. // This may differ from the set which is pending notification in the case of // partial or total failure to update the bug. // If a policy ID is included here, // BugManagementState.Policies[<policyID>].ActivationNotified will be // set to true on the rule. PolicyActivationsNotified map[PolicyID]struct{} }
type ClusterMetrics ¶
type ClusterMetrics map[metrics.ID]MetricValues
ClusterMetrics captures measurements of a cluster's impact and other variables, as needed to control the priority and verified status of bugs.
func (*ClusterMetrics) MeetsAnyOfThresholds ¶
func (c *ClusterMetrics) MeetsAnyOfThresholds(ts []*configpb.ImpactMetricThreshold) bool
MeetsAnyOfThresholds returns whether the cluster metrics meet or exceed any of the specified thresholds.
func (*ClusterMetrics) MeetsThreshold ¶
func (c *ClusterMetrics) MeetsThreshold(metricID metrics.ID, t *configpb.MetricThreshold) bool
MeetsThreshold returns whether the cluster metrics meet or exceed the specified threshold.
type Commentary ¶
type Commentary struct { // The comment bodies. This should be the most important information to surface // to the user, and appears first. Do not include leading or trailing new line // character. Bodies []string // This information appears last. Do not include leading or trailing new line // character. Footers []string }
Commentary represents part of a bug comment.
func ManualPriorityUpdateCommentary ¶
func ManualPriorityUpdateCommentary() Commentary
func MergeCommentary ¶
func MergeCommentary(cs ...Commentary) Commentary
MergeCommentary merges one or more commentary items into a bug comment. All commentary bodies appear first, followed by all footers.
func RuleAssociatedCommentary ¶
func RuleAssociatedCommentary(ruleURL string) Commentary
func (Commentary) ToComment ¶
func (c Commentary) ToComment() string
ToComment prepares a comment from commentary.
type DuplicateBugDetails ¶
type DuplicateBugDetails struct { // The rule ID. RuleID string // Bug is the source bug that was merged-into another bug. Bug BugID // IsAssigned indicated whether this bug is assigned or not. IsAssigned bool }
DuplicateBugDetails holds the data of a duplicate bug, this includes it's bug id, and whether or not it is assigned to a user.
type MetricValues ¶
MetricValues captures measurements for one metric, over different timescales.
type PolicyApplyer ¶
type PolicyApplyer struct {
// contains filtered or unexported fields
}
PolicyApplyer provides methods to apply bug managment policies in a manner that is generic to the bug management system being used.
func NewPolicyApplyer ¶
func NewPolicyApplyer(policies []*configpb.BugManagementPolicy, floorPriority configpb.BuganizerPriority) (PolicyApplyer, error)
NewPolicyApplyer initialises a new PolicyApplyer.
func (PolicyApplyer) NeedsPriorityOrVerifiedUpdate ¶
func (p PolicyApplyer) NeedsPriorityOrVerifiedUpdate(opts BugOptions) bool
NeedsPriorityOrVerifiedUpdate returns whether a bug needs to have its priority or verified status updated, based on the current active policies.
func (PolicyApplyer) NewIssueDescription ¶
func (p PolicyApplyer) NewIssueDescription(description *clustering.ClusterDescription, activatedPolicyIDs map[PolicyID]struct{}, uiBaseURL, ruleURL string) string
NewIssueDescription returns the issue description for a new bug. uiBaseURL is the URL of the UI base, without trailing slash, e.g. "https://luci-analysis.appspot.com".
func (PolicyApplyer) PoliciesByIDs ¶
func (p PolicyApplyer) PoliciesByIDs(policyIDs map[PolicyID]struct{}) []*configpb.BugManagementPolicy
PoliciesByIDs returns the policies with the given IDs, to the extent that they are still configured.
func (PolicyApplyer) PolicyActivatedComment ¶
func (p PolicyApplyer) PolicyActivatedComment(policyID PolicyID, uiBaseURL string, input TemplateInput) (string, error)
PolicyActivatedComment returns a comment used to notify a bug that a policy has activated on a bug for the first time.
func (PolicyApplyer) PolicyByID ¶
func (p PolicyApplyer) PolicyByID(policyID PolicyID) *configpb.BugManagementPolicy
PolicyByID returns the policy with the given ID, if it is still configured.
func (PolicyApplyer) PreparePriorityAndVerifiedChange ¶
func (p PolicyApplyer) PreparePriorityAndVerifiedChange(opts BugOptions, uiBaseURL string) (BugChange, error)
PreparePriorityAndVerifiedChange generates the changes to apply to a bug's priority and verified fields, based on the the current active policies.
A human readable explanation of the changes to include in a comment is also returned.
func (PolicyApplyer) RecommendedPriorityAndVerified ¶
func (p PolicyApplyer) RecommendedPriorityAndVerified(activePolicyIDs map[PolicyID]struct{}) (priority configpb.BuganizerPriority, verified bool)
RecommendedPriorityAndVerified identifies the priority and verification state recommended for a bug with the given set of policies active.
func (PolicyApplyer) SortPolicyIDsByPriorityDescending ¶
func (p PolicyApplyer) SortPolicyIDsByPriorityDescending(policyIDs map[PolicyID]struct{}) []PolicyID
SortPolicyIDsByPriorityDescending sorts policy IDs in descending priority order (i.e. P0 policies first, then P1, then P2, ...). Where multiple policies have the same priority, they are sorted by policy ID. Only policies which are configured are returned.
type Template ¶
type Template struct {
// contains filtered or unexported fields
}
Template is a template for bug comments.
func ParseTemplate ¶
ParseTemplate parses the given template source.
type TemplateBugID ¶
type TemplateBugID struct {
// contains filtered or unexported fields
}
TemplateBugID wraps the BugID type so we do not couple the interface the seen by a project's bug template to our implementation details. We want full control over the interface the template sees to ensure project configuration compatibility over time.
func NewTemplateBugID ¶
func NewTemplateBugID(id BugID) TemplateBugID
NewTemplateBugID initializes a new TemplateBugID.
func (TemplateBugID) BuganizerBugID ¶
func (b TemplateBugID) BuganizerBugID() (string, error)
BuganizerBugID returns the buganizer ID for a bug. E.g. "123456" for "b/123456". Errors if the bug is not a buganizer bug.
func (TemplateBugID) IsBuganizer ¶
func (b TemplateBugID) IsBuganizer() bool
IsBuganizer returns whether the bug is a Buganizer bug.
func (TemplateBugID) IsMonorail ¶
func (b TemplateBugID) IsMonorail() bool
IsMonorail returns whether the bug is a monorail bug.
func (TemplateBugID) MonorailBugID ¶
func (b TemplateBugID) MonorailBugID() (string, error)
MonorailBugID returns the monorail ID for a bug (e.g. "123456" for crbug.com/123456). Errors if the bug is not a monorail bug.
func (TemplateBugID) MonorailProject ¶
func (b TemplateBugID) MonorailProject() (string, error)
MonorailProject returns the monorail project for a bug. (e.g. "chromium" for crbug.com/123456). Errors if the bug is not a monorail bug.
type TemplateInput ¶
type TemplateInput struct { // The link to the LUCI Analysis failure association rule. RuleURL string // The identifier of the bug on which we are commenting. BugID TemplateBugID }
TemplateInput is the input to the policy-specified template for generating bug comments.
type UpdateDuplicateSourceRequest ¶
type UpdateDuplicateSourceRequest struct { // BugDetails are details of the bug to be updated. // This includes the bug ID and whether or not it is assigned. BugDetails DuplicateBugDetails // ErrorMessage is the error that occured handling the duplicate bug. // If this is set, it will be posted to the bug and bug will marked as // no longer a duplicate to avoid repeately triggering the same error. ErrorMessage string // DestinationRuleID is the rule ID for the destination bug, that the rule // for the source bug was merged into. // Only populated if Error is unset. DestinationRuleID string }
UpdateDuplicateSourceRequest represents a request to update the source bug of a duplicate bug (source bug, destination bug) pair, after LUCI Analysis has attempted to merge the failure association rule of the source to the destination.
Source Files ¶
Directories ¶
Path | Synopsis |
---|---|
Package buganizer contains methods to manage issues in Issue Tracker linked to failure association rules.
|
Package buganizer contains methods to manage issues in Issue Tracker linked to failure association rules. |
Package cron defines the update-analysis-and-bugs cron job handler.
|
Package cron defines the update-analysis-and-bugs cron job handler. |
Package updater contains methods to orchestrate automatic bug management, including automatic bug filing and automatic priority updates/auto-closure.
|
Package updater contains methods to orchestrate automatic bug management, including automatic bug filing and automatic priority updates/auto-closure. |