Browse Source

adding updated column

ryan 7 years ago
parent
commit
a2bbd89a9e

+ 1 - 0
CHANGELOG.md

@@ -9,6 +9,7 @@
 * **Alerting**: Support Pagerduty notification channel using Pagerduty V2 API [#10531](https://github.com/grafana/grafana/issues/10531), thx [@jbaublitz](https://github.com/jbaublitz)
 * **Templating**: Add comma templating format [#10632](https://github.com/grafana/grafana/issues/10632), thx [@mtanda](https://github.com/mtanda)
 * **Prometheus**: Support POST for query and query_range [#9859](https://github.com/grafana/grafana/pull/9859), thx [@mtanda](https://github.com/mtanda)
+* **Annotations API**: Record creation/update times and add more query options [#11333](https://github.com/grafana/grafana/pull/11333), thx [@mtanda](https://github.com/ryantxu)
 
 ### Minor
 * **OpsGenie**: Add triggered alerts as description [#11046](https://github.com/grafana/grafana/pull/11046), thx [@llamashoes](https://github.com/llamashoes)

+ 2 - 0
docs/sources/http_api/annotations.md

@@ -36,6 +36,8 @@ Query Parameters:
 - `alertId`: number. Optional. Find annotations for a specified alert.
 - `dashboardId`: number. Optional. Find annotations that are scoped to a specific dashboard
 - `panelId`: number. Optional. Find annotations that are scoped to a specific panel
+- `userId`: number. Optional. Find annotations created by a specific user
+- `type`: string. Optional. `alert`|`annotation` Return alerts or user created annotations
 - `tags`: string. Optional. Use this to filter global annotations. Global annotations are annotations from an annotation data source that are not connected specifically to a dashboard or panel. To do an "AND" filtering with multiple tags, specify the tags parameter multiple times e.g. `tags=tag1&tags=tag2`.
 
 **Example Response**:

+ 1 - 1
pkg/api/annotations.go

@@ -18,13 +18,13 @@ func GetAnnotations(c *m.ReqContext) Response {
 		From:        c.QueryInt64("from") / 1000,
 		To:          c.QueryInt64("to") / 1000,
 		OrgId:       c.OrgId,
+		UserId:      c.QueryInt64("userId"),
 		AlertId:     c.QueryInt64("alertId"),
 		DashboardId: c.QueryInt64("dashboardId"),
 		PanelId:     c.QueryInt64("panelId"),
 		Limit:       c.QueryInt64("limit"),
 		Tags:        c.QueryStrings("tags"),
 		Type:        c.Query("type"),
-		Sort:        c.Query("sort"),
 	}
 
 	repo := annotations.GetRepository()

+ 3 - 1
pkg/services/annotations/annotations.go

@@ -13,6 +13,7 @@ type ItemQuery struct {
 	OrgId        int64    `json:"orgId"`
 	From         int64    `json:"from"`
 	To           int64    `json:"to"`
+	UserId       int64    `json:"userId"`
 	AlertId      int64    `json:"alertId"`
 	DashboardId  int64    `json:"dashboardId"`
 	PanelId      int64    `json:"panelId"`
@@ -20,7 +21,6 @@ type ItemQuery struct {
 	RegionId     int64    `json:"regionId"`
 	Tags         []string `json:"tags"`
 	Type         string   `json:"type"`
-	Sort         string   `json:"sort"`
 
 	Limit int64 `json:"limit"`
 }
@@ -65,6 +65,7 @@ type Item struct {
 	NewState    string           `json:"newState"`
 	Epoch       int64            `json:"epoch"`
 	Created     int64            `json:"created"`
+	Updated     int64            `json:"updated"`
 	Tags        []string         `json:"tags"`
 	Data        *simplejson.Json `json:"data"`
 
@@ -83,6 +84,7 @@ type ItemDTO struct {
 	NewState    string           `json:"newState"`
 	PrevState   string           `json:"prevState"`
 	Created     int64            `json:"created"`
+	Updated     int64            `json:"updated"`
 	Time        int64            `json:"time"`
 	Text        string           `json:"text"`
 	RegionId    int64            `json:"regionId"`

+ 15 - 11
pkg/services/sqlstore/annotation.go

@@ -15,10 +15,14 @@ type SqlAnnotationRepo struct {
 }
 
 func (r *SqlAnnotationRepo) Save(item *annotations.Item) error {
+	if item.DashboardId == 0 {
+		return errors.New("Annotation is missing dashboard_id")
+	}
 	return inTransaction(func(sess *DBSession) error {
 		tags := models.ParseTagPairs(item.Tags)
 		item.Tags = models.JoinTagPairs(tags)
 		item.Created = time.Now().UnixNano() / int64(time.Millisecond)
+		item.Updated = item.Created
 		if _, err := sess.Table("annotation").Insert(item); err != nil {
 			return err
 		}
@@ -66,6 +70,7 @@ func (r *SqlAnnotationRepo) Update(item *annotations.Item) error {
 			err     error
 		)
 		existing := new(annotations.Item)
+		item.Updated = time.Now().UnixNano() / int64(time.Millisecond)
 
 		if item.Id == 0 && item.RegionId != 0 {
 			// Update region end time
@@ -130,6 +135,7 @@ func (r *SqlAnnotationRepo) Find(query *annotations.ItemQuery) ([]*annotations.I
 			annotation.tags,
 			annotation.data,
 			annotation.created,
+			annotation.updated,
 			usr.email,
 			usr.login,
 			alert.name as alert_name
@@ -167,6 +173,11 @@ func (r *SqlAnnotationRepo) Find(query *annotations.ItemQuery) ([]*annotations.I
 		params = append(params, query.PanelId)
 	}
 
+	if query.UserId != 0 {
+		sql.WriteString(` AND annotation.user_id = ?`)
+		params = append(params, query.UserId)
+	}
+
 	if query.From > 0 && query.To > 0 {
 		sql.WriteString(` AND annotation.epoch BETWEEN ? AND ?`)
 		params = append(params, query.From, query.To)
@@ -175,6 +186,9 @@ func (r *SqlAnnotationRepo) Find(query *annotations.ItemQuery) ([]*annotations.I
 	if query.Type == "alert" {
 		sql.WriteString(` AND annotation.alert_id > 0`)
 	}
+	if query.Type == "annotation" {
+		sql.WriteString(` AND annotation.alert_id = 0`)
+	}
 
 	if len(query.Tags) > 0 {
 		keyValueFilters := []string{}
@@ -208,17 +222,7 @@ func (r *SqlAnnotationRepo) Find(query *annotations.ItemQuery) ([]*annotations.I
 		query.Limit = 10
 	}
 
-	var sort string = "epoch DESC"
-	switch query.Sort {
-	case "time.asc":
-		sort = "epoch ASC"
-	case "created":
-		sort = "annotation.created DESC"
-	case "created.asc":
-		sort = "annotation.created ASC"
-	}
-
-	sql.WriteString(fmt.Sprintf(" ORDER BY %s LIMIT %v", sort, query.Limit))
+	sql.WriteString(fmt.Sprintf(" ORDER BY epoch DESC LIMIT %v", query.Limit))
 
 	items := make([]*annotations.ItemDTO, 0)
 

+ 7 - 1
pkg/services/sqlstore/migrations/annotation_mig.go

@@ -92,12 +92,18 @@ func addAnnotationMig(mg *Migrator) {
 		Mysql(updateTextFieldSql))
 
 	//
-	// Add a 'created' column
+	// Add a 'created' & 'updated' column
 	//
 	mg.AddMigration("Add created time to annotation table", NewAddColumnMigration(table, &Column{
 		Name: "created", Type: DB_BigInt, Nullable: true, Default: "0",
 	}))
+	mg.AddMigration("Add updated time to annotation table", NewAddColumnMigration(table, &Column{
+		Name: "updated", Type: DB_BigInt, Nullable: true, Default: "0",
+	}))
 	mg.AddMigration("Add index for created in annotation table", NewAddIndexMigration(table, &Index{
 		Cols: []string{"org_id", "created"}, Type: IndexType,
 	}))
+	mg.AddMigration("Add index for updated in annotation table", NewAddIndexMigration(table, &Index{
+		Cols: []string{"org_id", "updated"}, Type: IndexType,
+	}))
 }