func removeInvalidCerts(csvFilename string, dbMap *gorp.DbMap, stats statsd.Statter, statsRate float32) { file, err := os.Open(csvFilename) cmd.FailOnError(err, "Could not open the file for reading") csvReader := csv.NewReader(file) for { record, err := csvReader.Read() if err == io.EOF { break } else if err != nil { fmt.Println("Error:", err) return } identifierData := core.IdentifierData{ CertSHA1: record[0], } externalCert := core.ExternalCert{ SHA1: record[0], } deleteStart := time.Now() _, err = dbMap.Delete(&identifierData) stats.TimingDuration("ExistingCert.DomainDeleteTime", time.Since(deleteStart), statsRate) _, err = dbMap.Delete(&externalCert) stats.TimingDuration("ExistingCert.CertDeleteTime", time.Since(deleteStart), statsRate) stats.Inc("ExistingCert.CertsDeleted", 1, statsRate) } }
func addIdentifiers(csvFilename string, dbMap *gorp.DbMap, stats statsd.Statter, statsRate float32) { file, err := os.Open(csvFilename) cmd.FailOnError(err, "Could not open the file for reading") csvReader := csv.NewReader(file) for { record, err := csvReader.Read() if err == io.EOF { break } else if err != nil { fmt.Println("Error:", err) return } identifierData := core.IdentifierData{ ReversedName: record[1], CertSHA1: record[0], } importStart := time.Now() err = dbMap.Insert(&identifierData) stats.TimingDuration("ExistingCert.DomainImportTime", time.Since(importStart), statsRate) stats.Inc("ExistingCert.DomainsImported", 1, statsRate) } }
func addCerts(csvFilename string, dbMap *gorp.DbMap, stats statsd.Statter, statsRate float32) { file, err := os.Open(csvFilename) cmd.FailOnError(err, "Could not open the file for reading") csvReader := csv.NewReader(file) for { record, err := csvReader.Read() if err == io.EOF { break } else if err != nil { fmt.Println("Error:", err) return } notAfter, err := time.Parse(datestampFormat, record[3]) spkiBytes, err := hex.DecodeString(record[4]) certDER, err := hex.DecodeString(record[7]) externalCert := core.ExternalCert{ SHA1: record[0], Issuer: record[1], Subject: record[2], NotAfter: notAfter, SPKI: spkiBytes, Valid: record[5] == "1", EV: record[6] == "1", CertDER: certDER, } importStart := time.Now() err = dbMap.Insert(&externalCert) stats.TimingDuration("ExistingCert.CertImportTime", time.Since(importStart), statsRate) stats.Inc("ExistingCert.CertsImported", 1, statsRate) } }
func validateContacts(contacts []*core.AcmeURL, resolver core.DNSResolver, stats statsd.Statter) (err error) { for _, contact := range contacts { switch contact.Scheme { case "tel": continue case "mailto": rtt, err := validateEmail(contact.Opaque, resolver) stats.TimingDuration("RA.DNS.RTT.MX", rtt, 1.0) stats.Inc("RA.DNS.Rate", 1, 1.0) if err != nil { return err } default: err = core.MalformedRequestError(fmt.Sprintf("Contact method %s is not supported", contact.Scheme)) return } } return }
func timeDelivery(d amqp.Delivery, stats statsd.Statter, deliveryTimings map[string]time.Time) { // If d is a call add to deliveryTimings and increment openCalls, if it is a // response then get time.Since original call from deliveryTiming, send timing metric, and // decrement openCalls, in both cases send the gauges RpcCallsOpen and RpcBodySize if d.ReplyTo != "" { openCalls++ deliveryTimings[fmt.Sprintf("%s:%s", d.CorrelationId, d.ReplyTo)] = time.Now() } else { openCalls-- rpcSent := deliveryTimings[fmt.Sprintf("%s:%s", d.CorrelationId, d.RoutingKey)] if rpcSent != *new(time.Time) { respTime := time.Since(rpcSent) delete(deliveryTimings, fmt.Sprintf("%s:%s", d.CorrelationId, d.RoutingKey)) stats.TimingDuration(fmt.Sprintf("RpcCallTime.%s", d.Type), respTime, 1.0) } } stats.Gauge("RpcCallsOpen", openCalls, 1.0) stats.Gauge("RpcBodySize", int64(len(d.Body)), 1.0) }
// HandlerTimer monitors HTTP performance and sends the details to StatsD. func HandlerTimer(handler http.Handler, stats statsd.Statter) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { cStart := time.Now() openConnections++ stats.Gauge("HttpConnectionsOpen", openConnections, 1.0) handler.ServeHTTP(w, r) openConnections-- stats.Gauge("HttpConnectionsOpen", openConnections, 1.0) // (FIX: this doesn't seem to really work at catching errors...) state := "Success" for _, h := range w.Header()["Content-Type"] { if h == "application/problem+json" { state = "Error" break } } // set resp timing key based on success / failure stats.TimingDuration(fmt.Sprintf("HttpResponseTime.%s.%s", r.URL, state), time.Since(cStart), 1.0) }) }