Skip to content

Commit

Permalink
Merge 89ea851 into 21268e7
Browse files Browse the repository at this point in the history
  • Loading branch information
GuoYL123 committed Feb 4, 2020
2 parents 21268e7 + 89ea851 commit e7f292a
Show file tree
Hide file tree
Showing 8 changed files with 147 additions and 4 deletions.
33 changes: 33 additions & 0 deletions deployments/db.js
Expand Up @@ -68,6 +68,39 @@ db.createCollection( "label", {
} }
} );

db.createCollection( "polling_detail", {
validator: { $jsonSchema: {
bsonType: "object",
required: [ "id","polling_date","ip","user_agent","url_path","response_body","response_header" ],
properties: {
id: {
bsonType: "string",
},
polling_date: {
bsonType: "string"
},
ip: {
bsonType: "string"
},
user_agent: {
bsonType: "string"
},
url_path: {
bsonType: "string"
},
response_body: {
bsonType: "string"
},
response_header: {
bsonType: "string"
},
response_code: {
bsonType: "string"
}
}
} }
} );

//index
db.kv.createIndex({"id": 1}, { unique: true } );
db.kv.createIndex({key: 1, label_id: 1,domain:1,project:1},{ unique: true });
Expand Down
12 changes: 12 additions & 0 deletions pkg/model/kv.go
Expand Up @@ -48,3 +48,15 @@ type LabelHistoryResponse struct {
KVs []*KVDoc `json:"data,omitempty"`
Revision int `json:"revision"`
}

//PollingDetail record operation history
type PollingDetail struct {
Id string `json:"id,omitempty" yaml:"id,omitempty"`
PollingData map[string]interface{} `json:"polling_data,omitempty" yaml:"polling_data,omitempty"`
IP string `json:"ip,omitempty" yaml:"ip,omitempty"`
UserAgent string `json:"user_agent,omitempty" yaml:"user_agent,omitempty"`
UrlPath string `json:"url_path,omitempty" yaml:"url_path,omitempty"`
ResponseBody string `json:"response_body,omitempty" yaml:"response_body,omitempty"`
ResponseHeader string `json:"response_header,omitempty" yaml:"response_header,omitempty"`
ResponseCode int `json:"response_code,omitempty" yaml:"response_code,omitempty"`
}
26 changes: 26 additions & 0 deletions server/handler/record_handler.go
@@ -0,0 +1,26 @@
package handler

import (
"github.com/apache/servicecomb-kie/server/resource/v1"
"github.com/go-chassis/go-chassis/core/handler"
"github.com/go-chassis/go-chassis/core/invocation"
)

type RecordHandler struct{}

func (bk *RecordHandler) Handle(chain *handler.Chain, inv *invocation.Invocation, cb invocation.ResponseCallBack) {
chain.Next(inv, cb)
v1.Wg.Done()
}

func newRecorder() handler.Handler {
return &RecordHandler{}
}

//Name is handler name
func (bk *RecordHandler) Name() string {
return "record-handler"
}
func init() {
handler.RegisterHandler("record-handler", newRecorder)
}
17 changes: 17 additions & 0 deletions server/resource/v1/common.go
Expand Up @@ -24,6 +24,7 @@ import (
"github.com/apache/servicecomb-kie/server/pubsub"
"github.com/apache/servicecomb-kie/server/service"
uuid "github.com/satori/go.uuid"
"net"
"net/http"
"strconv"
"strings"
Expand Down Expand Up @@ -243,3 +244,19 @@ func queryAndResponse(rctx *restful.Context,
openlogging.Error(err.Error())
}
}

func ClientIP(r *http.Request) string {
xForwardedFor := r.Header.Get("X-Forwarded-For")
ip := strings.TrimSpace(strings.Split(xForwardedFor, ",")[0])
if ip != "" {
return ip
}
ip = strings.TrimSpace(r.Header.Get("X-Real-Ip"))
if ip != "" {
return ip
}
if ip, _, err := net.SplitHostPort(strings.TrimSpace(r.RemoteAddr)); err == nil {
return ip
}
return ""
}
37 changes: 37 additions & 0 deletions server/resource/v1/kv_resource.go
Expand Up @@ -19,21 +19,27 @@
package v1

import (
"encoding/json"
"fmt"
"github.com/apache/servicecomb-kie/pkg/common"
"github.com/apache/servicecomb-kie/pkg/model"
"github.com/apache/servicecomb-kie/server/pubsub"
"github.com/apache/servicecomb-kie/server/service"
"github.com/apache/servicecomb-kie/server/service/mongo/record"
goRestful "github.com/emicklei/go-restful"
"github.com/go-chassis/go-chassis/server/restful"
"github.com/go-mesh/openlogging"
uuid "github.com/satori/go.uuid"
"net/http"
"sync"
)

//KVResource has API about kv operations
type KVResource struct {
}

var Wg sync.WaitGroup

//Put create or update kv
func (r *KVResource) Put(context *restful.Context) {
var err error
Expand Down Expand Up @@ -132,6 +138,7 @@ func (r *KVResource) List(rctx *restful.Context) {
func returnData(rctx *restful.Context, domain interface{}, project string, labels map[string]string, limit, offset int64) {
revStr := rctx.ReadQueryParameter(common.QueryParamRev)
wait := rctx.ReadQueryParameter(common.QueryParamWait)
go RecordPollingDetail(rctx, revStr, wait, domain.(string), project, labels, limit, offset)
if revStr == "" {
if wait == "" {
queryAndResponse(rctx, domain, project, "", labels, limit, offset)
Expand Down Expand Up @@ -186,6 +193,36 @@ func returnData(rctx *restful.Context, domain interface{}, project string, label
}
}

func RecordPollingDetail(context *restful.Context, revStr, wait, domain, project string, labels map[string]string, limit, offset int64) {
Wg.Add(1)
data := &model.PollingDetail{}
data.Id = uuid.NewV4().String()
data.IP = ClientIP(context.Req.Request)
dataMap := map[string]interface{}{
"revStr": revStr,
"wait": wait,
"domain": domain,
"project": project,
"labels": labels,
"limit": limit,
"offset": offset,
}
data.PollingData = dataMap
data.UserAgent = context.Req.HeaderParameter("User-Agent")
data.UrlPath = context.ReadRequest().Method + " " + context.ReadRequest().URL.Path
Wg.Wait()
respHeader, _ := json.Marshal(context.Resp.Header())
data.ResponseHeader = string(respHeader)
data.ResponseCode = context.Resp.StatusCode()
//todo : get the response body data is private
//data.ResponseBody = context.Resp
_, err := record.CreateRecord(context.Ctx, data)
if err != nil {
openlogging.Warn("record polling detail failed" + err.Error())
return
}
}

//Search search key only by label
func (r *KVResource) Search(context *restful.Context) {
var err error
Expand Down
16 changes: 16 additions & 0 deletions server/service/mongo/record/polling_detail_dao.go
@@ -0,0 +1,16 @@
package record

import (
"context"
"github.com/apache/servicecomb-kie/pkg/model"
"github.com/apache/servicecomb-kie/server/service/mongo/session"
)

func CreateRecord(ctx context.Context, detail *model.PollingDetail) (*model.PollingDetail, error) {
collection := session.GetDB().Collection(session.CollectionPollingDetail)
_, err := collection.InsertOne(ctx, detail)
if err != nil {
return nil, err
}
return detail, nil
}
1 change: 1 addition & 0 deletions server/service/mongo/record/polling_detail_dao_test.go
@@ -0,0 +1 @@
package record
9 changes: 5 additions & 4 deletions server/service/mongo/session/session.go
Expand Up @@ -42,10 +42,11 @@ import (
const (
DBName = "kie"

CollectionLabel = "label"
CollectionKV = "kv"
CollectionKVRevision = "kv_revision"
CollectionCounter = "counter"
CollectionLabel = "label"
CollectionKV = "kv"
CollectionKVRevision = "kv_revision"
CollectionPollingDetail = "polling_detail"
CollectionCounter = "counter"

DefaultTimeout = 5 * time.Second
DefaultValueType = "text"
Expand Down

0 comments on commit e7f292a

Please sign in to comment.