Skip to content

Commit

Permalink
track conversion log
Browse files Browse the repository at this point in the history
  • Loading branch information
wenweihu86 committed Oct 22, 2017
1 parent 6d4ede7 commit a69ee53
Show file tree
Hide file tree
Showing 9 changed files with 118 additions and 4 deletions.
2 changes: 2 additions & 0 deletions conf/ad_server.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@ AdServerLogFileName = "./log/ad_server.log"
SearchLogFileName = "./log/ad_search.log"
ImpressionLogFileName = "./log/ad_impression.log"
ClickLogFileName = "./log/ad_click.log"
ConversionLogFileName = "./log/ad_conversion.log"

# track url
ImpressionTrackUrlPrefix = "http://localhost:8001/ad/impression"
ClickTrackUrlPrefix = "http://localhost:8001/ad/click"
ConversionTrackUrlPrefix = "http://localhost:8001/ad/conversion"
2 changes: 1 addition & 1 deletion src/adhandler/click_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ func ClickHandler(w http.ResponseWriter, r *http.Request) {
adserver.AdServerLog.Debug(fmt.Sprintf("ClickHandler click_url=%s", clickUrl))

adserver.ClickLog.Info(fmt.Sprintf(
"searchId=%s slotId=%d ip=%s deviceId=%s os=%d osVersion=%s unit_id=%d creativeId=%d",
"click=1 searchId=%s slotId=%d ip=%s deviceId=%s os=%d osVersion=%s unit_id=%d creativeId=%d",
searchId, slotId, ip, deviceId, os, osVersion, unitId, creativeId))
http.Redirect(w, r, clickUrl, http.StatusFound)
}
85 changes: 85 additions & 0 deletions src/adhandler/conversion_handler.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package adhandler

import (
"net/http"
"strconv"
"adserver"
"encoding/base64"
"fmt"
"net/url"
)

// 转化监控handler
func ConversionHandler(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
if len(r.Form["i"]) == 0 {
w.Write([]byte("{\"status\": 1}"))
return
}
i := r.Form["i"][0]
queryStringBytes, err := base64.StdEncoding.DecodeString(i)
if err != nil {
w.Write([]byte("{\"status\": 1}"))
return
}
queryString := string(queryStringBytes)
paramMap, _ := url.ParseQuery(queryString)

// search_id
var searchId string
if searchIds, exist := paramMap["search_id"]; exist {
searchId = searchIds[0]
}

// slot_id
var slotId uint32
if slotIds, exist := paramMap["slot_id"]; exist {
tmpInt, _ := strconv.ParseUint(slotIds[0], 10, 32)
slotId = uint32(tmpInt)
}

// ip
var ip string
if ips, exist := paramMap["ip"]; exist {
ip = ips[0]
}

// device_id
var deviceId string
if deviceIds, exist := paramMap["device_id"]; exist {
deviceId = deviceIds[0]
}

// os
var os uint32
if osString, exist := paramMap["os"]; exist {
tmpInt, _ := strconv.ParseUint(osString[0], 10, 32)
os = uint32(tmpInt)
}

// os_version
var osVersion string
if osVersions, exist := paramMap["os_version"]; exist {
osVersion = osVersions[0]
}

// unit_id
var unitId uint32
if unitIdString, exist := paramMap["unit_id"]; exist {
tmpInt, _ := strconv.ParseUint(unitIdString[0], 10, 32)
unitId = uint32(tmpInt)
}

// creative_id
var creativeId uint32
if creativeIdString, exist := paramMap["creative_id"]; exist {
tmp, _ := strconv.ParseUint(creativeIdString[0], 10, 32)
creativeId = uint32(tmp)
}

adserver.ConversionLog.Info(fmt.Sprintf(
"conversion=1 searchId=%s slotId=%d ip=%s deviceId=%s os=%d osVersion=%s unit_id=%d creativeId=%d",
searchId, slotId, ip, deviceId, os, osVersion, unitId, creativeId))
res := "{\"status\": 0}"
w.Write([]byte(res))
}
2 changes: 1 addition & 1 deletion src/adhandler/impression_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ func ImpressionHandler(w http.ResponseWriter, r *http.Request) {
}

adserver.ImpressionLog.Info(fmt.Sprintf(
"searchId=%s slotId=%d ip=%s deviceId=%s os=%d osVersion=%s unit_id=%d creativeId=%d",
"impression=1 searchId=%s slotId=%d ip=%s deviceId=%s os=%d osVersion=%s unit_id=%d creativeId=%d",
searchId, slotId, ip, deviceId, os, osVersion, unitId, creativeId))
res := "{\"status\": 0}"
w.Write([]byte(res))
Expand Down
18 changes: 18 additions & 0 deletions src/adhandler/search_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ func SearchHandler(w http.ResponseWriter, r *http.Request) {
}
adInfo.ImpressionTrackUrl = buildImpressionTrackUrl(req, adInfo)
adInfo.ClickTrackUrl = buildClickTrackUrl(req, adInfo)
adInfo.ConversionTrackUrl = buildConversionTrackUrl(req, adInfo)
adList := make([]adserver.AdInfo, 0, 1)
adList = append(adList, adInfo)
res.ResCode = 0
Expand Down Expand Up @@ -156,3 +157,20 @@ func buildClickTrackUrl(req *adserver.Request, adInfo adserver.AdInfo) string {
return impressionTrackUrl
}

func buildConversionTrackUrl(req *adserver.Request, adInfo adserver.AdInfo) string {
var paramBuf bytes.Buffer
paramBuf.WriteString(fmt.Sprintf("search_id=%s", req.SearchId))
paramBuf.WriteString(fmt.Sprintf("&slot_id=%d", req.SlotId))
paramBuf.WriteString(fmt.Sprintf("&ip=%s", req.Ip))
paramBuf.WriteString(fmt.Sprintf("&device_id=%s", req.DeviceId))
paramBuf.WriteString(fmt.Sprintf("&os=%d", req.Os))
paramBuf.WriteString(fmt.Sprintf("&os_version=%s", req.OsVersion))
paramBuf.WriteString(fmt.Sprintf("&unit_id=%d", adInfo.UnitId))
paramBuf.WriteString(fmt.Sprintf("&creative_id=%d", adInfo.CreativeId))
paramBuf.WriteString(fmt.Sprintf("&click_url=%s", adInfo.ClickUrl))
paramEncoded := base64.StdEncoding.EncodeToString(paramBuf.Bytes())
conversionTrackUrl := fmt.Sprintf("%s?i=%s",
adserver.GlobalConfObject.ConversionTrackUrlPrefix, paramEncoded)
return conversionTrackUrl
}

7 changes: 5 additions & 2 deletions src/adserver/ad_log.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@ import "github.com/ibbd-dev/go-async-log"

var AdServerLog *asyncLog.LogFile // 除了检索、展现、点击监控外,所以日志都用这个log打印
var SearchLog *asyncLog.LogFile // 每个检索请求打印一行日志
var ImpressionLog *asyncLog.LogFile // 每条展现请求打印一行日志
var ClickLog *asyncLog.LogFile // 每条点击请求打印一行日志
var ImpressionLog *asyncLog.LogFile // 每个展现请求打印一行日志
var ClickLog *asyncLog.LogFile // 每个点击请求打印一行日志
var ConversionLog *asyncLog.LogFile // 每个转化请求打印一行日志

/*
* ibbd-dev/go-async-log 日志框架说明
Expand All @@ -24,4 +25,6 @@ func InitLog(globalConfObject *GlobalConf) {
asyncLog.LevelInfo)
ClickLog = asyncLog.NewLevelLog(globalConfObject.ClickLogFileName,
asyncLog.LevelInfo)
ConversionLog = asyncLog.NewLevelLog(globalConfObject.ConversionLogFileName,
asyncLog.LevelInfo)
}
4 changes: 4 additions & 0 deletions src/adserver/global_conf.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,11 @@ type GlobalConf struct {
SearchLogFileName string
ImpressionLogFileName string
ClickLogFileName string
ConversionLogFileName string
// track url prefix
ImpressionTrackUrlPrefix string
ClickTrackUrlPrefix string
ConversionTrackUrlPrefix string
}

var GlobalConfObject *GlobalConf
Expand Down Expand Up @@ -46,6 +48,8 @@ func LoadGlobalConf(configPath, configFileName string) {
fmt.Printf("SearchLogFileName=%s\n", GlobalConfObject.SearchLogFileName)
fmt.Printf("ImpressionLogFileName=%s\n", GlobalConfObject.ImpressionLogFileName)
fmt.Printf("ClickLogFileName=%s\n", GlobalConfObject.ClickLogFileName)
fmt.Printf("ConversionLogFileName=%s\n", GlobalConfObject.ConversionLogFileName)
fmt.Printf("ImpressionTrackUrlPrefix=%s\n", GlobalConfObject.ImpressionTrackUrlPrefix)
fmt.Printf("ClickTrackUrlPrefix=%s\n", GlobalConfObject.ClickTrackUrlPrefix)
fmt.Printf("ConversionTrackUrlPrefix=%s\n", GlobalConfObject.ConversionTrackUrlPrefix)
}
1 change: 1 addition & 0 deletions src/adserver/response.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ type AdInfo struct {
ClickUrl string
ImpressionTrackUrl string
ClickTrackUrl string
ConversionTrackUrl string
}

type Response struct {
Expand Down
1 change: 1 addition & 0 deletions src/main/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,6 @@ func main() {
http.HandleFunc("/ad/search", adhandler.SearchHandler)
http.HandleFunc("/ad/impression",adhandler.ImpressionHandler)
http.HandleFunc("/ad/click",adhandler.ClickHandler)
http.HandleFunc("/ad/conversion",adhandler.ConversionHandler)
http.ListenAndServe(":8001", nil)
}

0 comments on commit a69ee53

Please sign in to comment.