blob: 8ac0e8070ebf9f8215f1c279d0606c9971d06dbd [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package tmcheck
import (
"fmt"
"time"
"github.com/apache/trafficcontrol/lib/go-tc"
to "github.com/apache/trafficcontrol/traffic_ops/v3-client"
)
const QueryIntervalMax = time.Duration(10) * time.Second
// ValidateQueryInterval validates the given monitor has an acceptable Query Interval 95th percentile.
func ValidateQueryInterval(tmURI string, toClient *to.Session) error {
stats, err := GetStats(tmURI + TrafficMonitorStatsPath)
if err != nil {
return fmt.Errorf("getting Stats: %v", err)
}
queryInterval := time.Duration(stats.QueryInterval95thPercentile) * time.Millisecond
if queryInterval > QueryIntervalMax {
return fmt.Errorf("Query Interval 95th Percentile %v greater than max %v", queryInterval, QueryIntervalMax)
}
return nil
}
// QueryIntervalValidator is designed to be run as a goroutine, and does not return. It continously validates every `interval`, and calls `onErr` on failure, `onResumeSuccess` when a failure ceases, and `onCheck` on every poll.
func QueryIntervalValidator(
tmURI string,
toClient *to.Session,
interval time.Duration,
grace time.Duration,
onErr func(error),
onResumeSuccess func(),
onCheck func(error),
) {
Validator(tmURI, toClient, interval, grace, onErr, onResumeSuccess, onCheck, ValidateQueryInterval)
}
// AllMonitorsQueryIntervalValidator is designed to be run as a goroutine, and does not return. It continously validates every `interval`, and calls `onErr` on failure, `onResumeSuccess` when a failure ceases, and `onCheck` on every poll. Note the error passed to `onErr` may be a general validation error not associated with any monitor, in which case the passed `tc.TrafficMonitorName` will be empty.
func AllMonitorsQueryIntervalValidator(
toClient *to.Session,
interval time.Duration,
includeOffline bool,
grace time.Duration,
onErr func(tc.TrafficMonitorName, error),
onResumeSuccess func(tc.TrafficMonitorName),
onCheck func(tc.TrafficMonitorName, error),
) {
AllValidator(toClient, interval, includeOffline, grace, onErr, onResumeSuccess, onCheck, ValidateAllMonitorsQueryInterval)
}
// ValidateAllMonitorsQueryInterval validates, for all monitors in the given Traffic Ops, an acceptable query interval 95th percentile.
func ValidateAllMonitorsQueryInterval(toClient *to.Session, includeOffline bool) (map[tc.TrafficMonitorName]error, error) {
servers, err := GetMonitors(toClient, includeOffline)
if err != nil {
return nil, err
}
errs := map[tc.TrafficMonitorName]error{}
for _, server := range servers {
uri := fmt.Sprintf("http://%s.%s", server.HostName, server.DomainName)
errs[tc.TrafficMonitorName(server.HostName)] = ValidateQueryInterval(uri, toClient)
}
return errs, nil
}