|
7 | 7 | "net"
|
8 | 8 | "net/http"
|
9 | 9 | "net/url"
|
| 10 | + "strconv" |
10 | 11 | "strings"
|
11 | 12 | "sync"
|
12 | 13 | "sync/atomic"
|
@@ -400,6 +401,7 @@ func (s *Server) Start() error {
|
400 | 401 | router.HandleFunc("/status", s.Status).Methods("GET")
|
401 | 402 | router.HandleFunc("/state/{nodeID}/{action}", s.ApplyAction).Methods("PUT")
|
402 | 403 | router.HandleFunc("/drainers", s.AllDrainers).Methods("GET")
|
| 404 | + router.HandleFunc("/debug/binlog/{ts}", s.BinlogByTS).Methods("GET") |
403 | 405 | http.Handle("/", router)
|
404 | 406 | prometheus.DefaultGatherer = registry
|
405 | 407 | http.Handle("/metrics", prometheus.Handler())
|
@@ -593,6 +595,31 @@ func (s *Server) Status(w http.ResponseWriter, r *http.Request) {
|
593 | 595 | s.PumpStatus().Status(w, r)
|
594 | 596 | }
|
595 | 597 |
|
| 598 | +// BinlogByTS exposes api get get binlog by ts |
| 599 | +func (s *Server) BinlogByTS(w http.ResponseWriter, r *http.Request) { |
| 600 | + tsStr := mux.Vars(r)["ts"] |
| 601 | + ts, err := strconv.ParseInt(tsStr, 10, 64) |
| 602 | + if err != nil { |
| 603 | + w.Write([]byte(fmt.Sprintf("invalid parameter ts: %s", tsStr))) |
| 604 | + return |
| 605 | + } |
| 606 | + |
| 607 | + binlog, err := s.storage.GetBinlog(ts) |
| 608 | + if err != nil { |
| 609 | + w.Write([]byte(err.Error())) |
| 610 | + return |
| 611 | + } |
| 612 | + |
| 613 | + w.Write([]byte(binlog.String())) |
| 614 | + if len(binlog.PrewriteValue) > 0 { |
| 615 | + prewriteValue := new(pb.PrewriteValue) |
| 616 | + prewriteValue.Unmarshal(binlog.PrewriteValue) |
| 617 | + |
| 618 | + w.Write([]byte("\n\n PrewriteValue: \n")) |
| 619 | + w.Write([]byte(prewriteValue.String())) |
| 620 | + } |
| 621 | +} |
| 622 | + |
596 | 623 | // PumpStatus returns all pumps' status.
|
597 | 624 | func (s *Server) PumpStatus() *HTTPStatus {
|
598 | 625 | status, err := s.node.NodesStatus(s.ctx)
|
|
0 commit comments