func main() {
	flag.Parse()
	checkArguments()

	check := nagiosplugin.NewCheck()
	defer check.Finish()

	var data map[string]interface{}
	queryApi(parseUrl(*api_url)+"/streams/"+url.QueryEscape(*stream)+"/alerts/check", url.QueryEscape(*user), url.QueryEscape(*pass), &data)

	total := data["total_triggered"].(float64)
	results := data["results"].([]interface{})

	var stream_title string

	queryApi(parseUrl(*api_url)+"/streams/"+url.QueryEscape(*stream), url.QueryEscape(*user), url.QueryEscape(*pass), &data)
	stream_title = data["title"].(string)

	for i, result := range results {
		i = i
		mappedResult := result.(map[string]interface{})
		mappedCondition := mappedResult["condition"].(map[string]interface{})
		if *condition != "<ID>" && *condition == mappedCondition["id"] && mappedResult["triggered"] == true {
			nagiosplugin.Exit(nagiosplugin.CRITICAL, "Alert triggered for stream '"+stream_title+"' condition: "+*condition)
		}
	}

	if total > 0 && *condition == "<ID>" {
		nagiosplugin.Exit(nagiosplugin.CRITICAL, fmt.Sprintf("%g", total)+" alert/s triggered for stream "+stream_title)
	}

	check.AddResult(nagiosplugin.OK, "No stream alerts triggered for stream: "+stream_title)
}
func main() {

	// struct to quantify states
	type volume_state_count struct {
		count      int
		percentage float64
	}

	// map of volume states
	var volume_states = make(map[string]volume_state_count)

	var (
		Volume_Status string
		Total         int
		Percentage    float64
	)

	// Initialize the check - this will return an UNKNOWN result
	// until more results are added.
	check := nagiosplugin.NewCheck()
	// If we exit early or panic() we'll still output a result.
	defer check.Finish()

	// obtain data here
	//connString := fmt.Sprint(user, ":", password, "@tcp(", hostname, ":", port, ")/cinder")
	connString := fmt.Sprintf("%s:%s@tcp(%s:%d)/cinder", user, password, hostname, port)
	db, err := sql.Open("mysql", connString)

	if err != nil {
		check.Exitf(nagiosplugin.UNKNOWN, fmt.Sprintf("Could not create database connection: %s", err.Error()))
	}
	defer db.Close()

	// Open doesn't open a connection. Validate DSN data:
	err = db.Ping()
	if err != nil {
		check.Exitf(nagiosplugin.UNKNOWN, fmt.Sprintf("Could not open database connection: %s", err.Error()))
	}

	// Prepare statement for reading data
	stmt, err := db.Prepare("SELECT status AS `Volume_Status`, COUNT(1) AS `Total` ,COUNT(1) / t.cnt * 100 AS `Percentage` FROM volumes v CROSS JOIN (SELECT COUNT(1) AS cnt FROM volumes WHERE created_at > DATE_SUB(NOW(), INTERVAL ? HOUR)) t WHERE v.created_at > DATE_SUB(NOW(), INTERVAL ? HOUR) GROUP BY v.status;")
	if err != nil {
		check.Exitf(nagiosplugin.UNKNOWN, fmt.Sprintf("Could not prepare statement: %s", err.Error()))
	}
	defer stmt.Close()

	// Query the results for the last n hours
	rows, err := stmt.Query(hours, hours)
	if err != nil {
		check.Exitf(nagiosplugin.UNKNOWN, fmt.Sprintf("Could not execute query: %s", err.Error()))
	}
	defer rows.Close()

	for rows.Next() {
		err = rows.Scan(&Volume_Status, &Total, &Percentage)
		if err != nil {
			check.Exitf(nagiosplugin.UNKNOWN, fmt.Sprintf("Invalid result set: %s", err.Error()))
		}
		volume_states[Volume_Status] = volume_state_count{count: Total, percentage: Percentage}
	}

	/*fmt.Println("Database Results:")
	  for key, value := range volume_states {
	      fmt.Println("Key:", key, "Value:", value)
	  }*/

	//check for state(s)
	states := strings.Split(stateslist, ",")
	for index, state := range states {

		if state_count, ok := volume_states[state]; ok {
			if state_count.percentage < float64(warning) {
				check.AddResult(nagiosplugin.OK, "Cinder Volume OK")
				check.AddPerfDatum(fmt.Sprintf("Volumes in state '%s'", state), "%", state_count.percentage, float64(warning), float64(critical), 0.0, 100.0)
				check.AddPerfDatum("Count", "", float64(state_count.count), 0.0, 0.0, 0.0, 0.0)
				//check.Finish()
			} else if state_count.percentage >= float64(critical) {
				check.AddResult(nagiosplugin.CRITICAL, "Cinder Volume CRITICAL")
				check.AddPerfDatum(fmt.Sprintf("Volumes in state '%s'", state), "%", state_count.percentage, float64(warning), float64(critical), 0.0, 100.0)
				check.AddPerfDatum("Count", "", float64(state_count.count), 0.0, 0.0, 0.0, 0.0)
				//check.Finish()
			} else {
				check.AddResult(nagiosplugin.WARNING, "Cinder Volume WARNING")
				check.AddPerfDatum(fmt.Sprintf("Volumes in state '%s'", state), "%", state_count.percentage, float64(warning), float64(critical), 0.0, 100.0)
				check.AddPerfDatum("Count", "", float64(state_count.count), 0.0, 0.0, 0.0, 0.0)
				//check.Finish()
			}

		} else { // if the map doesn't contain the state key then no volumes are in that state and therefore non exceed the threshold
			check.AddResult(nagiosplugin.OK, "Cinder Volume OK")
			check.AddPerfDatum(fmt.Sprintf("Volumes in state '%s'", state), "%", state_count.percentage, float64(warning), float64(critical), 0.0, 100.0)
			check.AddPerfDatum("Count", "", float64(state_count.count), 0.0, 0.0, 0.0, 0.0)
			//check.Finish()
		}
		fmt.Println(index)
	}
	check.Finish()

}