Skip to content

Commit 7eb6c7e

Browse files
committed
server refactoring
memStats -> metrics change MetricsStorager interface
1 parent a9508d9 commit 7eb6c7e

File tree

7 files changed

+309
-305
lines changed

7 files changed

+309
-305
lines changed

internal/agent/statsreader/statsreader_test.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ import (
77
)
88

99
func TestRefresh(t *testing.T) {
10-
var memStatistics MetricsDump
11-
memStatistics.Refresh()
12-
memStatistics.Refresh()
13-
memStatistics.Refresh()
10+
var metricsDump MetricsDump
11+
metricsDump.Refresh()
12+
metricsDump.Refresh()
13+
metricsDump.Refresh()
1414

15-
assert.Equal(t, 3, int(memStatistics.PollCount))
15+
assert.Equal(t, 3, int(metricsDump.PollCount))
1616
}

internal/server/handlers/handlers.go

+12-12
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313
)
1414

1515
//UpdateStatJSONPost update stat via json
16-
func UpdateStatJSONPost(rw http.ResponseWriter, request *http.Request, memStatsStorage storage.MemStatsMemoryRepo) {
16+
func UpdateStatJSONPost(rw http.ResponseWriter, request *http.Request, metricsMemoryRepo storage.MetricStorager) {
1717
var OneMetric storage.Metric
1818

1919
err := json.NewDecoder(request.Body).Decode(&OneMetric)
@@ -28,7 +28,7 @@ func UpdateStatJSONPost(rw http.ResponseWriter, request *http.Request, memStatsS
2828
return
2929
}
3030

31-
err = memStatsStorage.Update(OneMetric.ID, storage.MetricValue{
31+
err = metricsMemoryRepo.Update(OneMetric.ID, storage.MetricValue{
3232
MType: OneMetric.MType,
3333
Value: OneMetric.Value,
3434
Delta: OneMetric.Delta,
@@ -43,7 +43,7 @@ func UpdateStatJSONPost(rw http.ResponseWriter, request *http.Request, memStatsS
4343
rw.Write([]byte("Ok"))
4444
}
4545

46-
func UpdateGaugePost(rw http.ResponseWriter, request *http.Request, memStatsStorage storage.MemStatsMemoryRepo) {
46+
func UpdateGaugePost(rw http.ResponseWriter, request *http.Request, metricsMemoryRepo storage.MetricStorager) {
4747
statName := chi.URLParam(request, "statName")
4848
statValue := chi.URLParam(request, "statValue")
4949
statValueFloat, err := strconv.ParseFloat(statValue, 64)
@@ -54,7 +54,7 @@ func UpdateGaugePost(rw http.ResponseWriter, request *http.Request, memStatsStor
5454
return
5555
}
5656

57-
err = memStatsStorage.Update(statName, storage.MetricValue{
57+
err = metricsMemoryRepo.Update(statName, storage.MetricValue{
5858
MType: "gauge",
5959
Value: &statValueFloat,
6060
})
@@ -70,7 +70,7 @@ func UpdateGaugePost(rw http.ResponseWriter, request *http.Request, memStatsStor
7070
rw.Write([]byte("Ok"))
7171
}
7272

73-
func UpdateCounterPost(rw http.ResponseWriter, request *http.Request, memStatsStorage storage.MemStatsMemoryRepo) {
73+
func UpdateCounterPost(rw http.ResponseWriter, request *http.Request, metricsMemoryRepo storage.MetricStorager) {
7474
statName := chi.URLParam(request, "statName")
7575
statValue := chi.URLParam(request, "statValue")
7676
statValueInt, err := strconv.ParseInt(statValue, 10, 64)
@@ -80,7 +80,7 @@ func UpdateCounterPost(rw http.ResponseWriter, request *http.Request, memStatsSt
8080
return
8181
}
8282

83-
err = memStatsStorage.Update(statName, storage.MetricValue{
83+
err = metricsMemoryRepo.Update(statName, storage.MetricValue{
8484
MType: "counter",
8585
Delta: &statValueInt,
8686
})
@@ -103,7 +103,7 @@ func UpdateNotImplementedPost(rw http.ResponseWriter, request *http.Request) {
103103
rw.Write([]byte("Not implemented"))
104104
}
105105

106-
func PrintStatsValues(rw http.ResponseWriter, request *http.Request, memStatsStorage storage.MemStatsMemoryRepo) {
106+
func PrintStatsValues(rw http.ResponseWriter, request *http.Request, metricsMemoryRepo storage.MetricStorager) {
107107
htmlTemplate := `
108108
<html>
109109
<head>
@@ -116,7 +116,7 @@ func PrintStatsValues(rw http.ResponseWriter, request *http.Request, memStatsSto
116116
</html>`
117117
keyValuesHTML := ""
118118

119-
for metricKey, metric := range memStatsStorage.GetAllMetrics() {
119+
for metricKey, metric := range metricsMemoryRepo.ReadAll() {
120120
keyValuesHTML += fmt.Sprintf("<div><b>%v</b>: %v</div>", metricKey, metric.GetStringValue())
121121
}
122122

@@ -127,7 +127,7 @@ func PrintStatsValues(rw http.ResponseWriter, request *http.Request, memStatsSto
127127
}
128128

129129
//JSONStatValue get stat value via json
130-
func JSONStatValue(rw http.ResponseWriter, request *http.Request, memStatsStorage storage.MemStatsMemoryRepo) {
130+
func JSONStatValue(rw http.ResponseWriter, request *http.Request, metricsMemoryRepo storage.MetricStorager) {
131131
var InputMetricsJSON struct {
132132
ID string `json:"id" valid:"required"`
133133
MType string `json:"type" valid:"required,in(counter|gauge)"`
@@ -145,7 +145,7 @@ func JSONStatValue(rw http.ResponseWriter, request *http.Request, memStatsStorag
145145
return
146146
}
147147

148-
statValue, err := memStatsStorage.ReadValue(InputMetricsJSON.ID, InputMetricsJSON.MType)
148+
statValue, err := metricsMemoryRepo.Read(InputMetricsJSON.ID, InputMetricsJSON.MType)
149149
if err != nil {
150150
http.Error(rw, "Unknown statName", http.StatusNotFound)
151151
return
@@ -167,11 +167,11 @@ func JSONStatValue(rw http.ResponseWriter, request *http.Request, memStatsStorag
167167
}
168168
}
169169

170-
func PrintStatValue(rw http.ResponseWriter, request *http.Request, memStatsStorage storage.MemStatsMemoryRepo) {
170+
func PrintStatValue(rw http.ResponseWriter, request *http.Request, metricsMemoryRepo storage.MetricStorager) {
171171
statType := chi.URLParam(request, "statType")
172172
statName := chi.URLParam(request, "statName")
173173

174-
metric, err := memStatsStorage.ReadValue(statName, statType)
174+
metric, err := metricsMemoryRepo.Read(statName, statType)
175175
if err != nil {
176176
rw.WriteHeader(http.StatusNotFound)
177177
rw.Write([]byte("Unknown statName"))

internal/server/server/server.go

+11-11
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ type Server struct {
1919
startTime time.Time
2020
}
2121

22-
func newRouter(memStatsStorage storage.MemStatsMemoryRepo) chi.Router {
22+
func newRouter(metricsMemoryRepo storage.MetricStorager) chi.Router {
2323
router := chi.NewRouter()
2424

2525
router.Use(chimiddleware.RequestID)
@@ -30,29 +30,29 @@ func newRouter(memStatsStorage storage.MemStatsMemoryRepo) chi.Router {
3030

3131
//Маршруты
3232
router.Get("/", func(writer http.ResponseWriter, request *http.Request) {
33-
handlers.PrintStatsValues(writer, request, memStatsStorage)
33+
handlers.PrintStatsValues(writer, request, metricsMemoryRepo)
3434
})
3535

3636
//json handler
3737
router.Post("/value/", func(writer http.ResponseWriter, request *http.Request) {
38-
handlers.JSONStatValue(writer, request, memStatsStorage)
38+
handlers.JSONStatValue(writer, request, metricsMemoryRepo)
3939
})
4040

4141
router.Get("/value/{statType}/{statName}", func(writer http.ResponseWriter, request *http.Request) {
42-
handlers.PrintStatValue(writer, request, memStatsStorage)
42+
handlers.PrintStatValue(writer, request, metricsMemoryRepo)
4343
})
4444

4545
router.Route("/update/", func(router chi.Router) {
4646
//json handler
4747
router.Post("/", func(writer http.ResponseWriter, request *http.Request) {
48-
handlers.UpdateStatJSONPost(writer, request, memStatsStorage)
48+
handlers.UpdateStatJSONPost(writer, request, metricsMemoryRepo)
4949
})
5050

5151
router.Post("/gauge/{statName}/{statValue}", func(writer http.ResponseWriter, request *http.Request) {
52-
handlers.UpdateGaugePost(writer, request, memStatsStorage)
52+
handlers.UpdateGaugePost(writer, request, metricsMemoryRepo)
5353
})
5454
router.Post("/counter/{statName}/{statValue}", func(writer http.ResponseWriter, request *http.Request) {
55-
handlers.UpdateCounterPost(writer, request, memStatsStorage)
55+
handlers.UpdateCounterPost(writer, request, metricsMemoryRepo)
5656
})
5757
router.Post("/{statType}/{statName}/{statValue}", func(writer http.ResponseWriter, request *http.Request) {
5858
handlers.UpdateNotImplementedPost(writer, request)
@@ -69,12 +69,12 @@ func NewServer(config config.Config) *Server {
6969
}
7070

7171
func (server *Server) Run() {
72-
memStatsStorage := storage.NewMemStatsMemoryRepo(server.config.Store)
73-
defer memStatsStorage.Close()
72+
metricsMemoryRepo := storage.NewMetricsMemoryRepo(server.config.Store)
73+
defer metricsMemoryRepo.Close()
7474
if server.config.Store.Restore {
75-
memStatsStorage.InitFromFile()
75+
metricsMemoryRepo.InitFromFile()
7676
}
77-
server.chiRouter = newRouter(memStatsStorage)
77+
server.chiRouter = newRouter(metricsMemoryRepo)
7878

7979
log.Fatal(http.ListenAndServe(server.config.ServerAddr, server.chiRouter))
8080
}
+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package storage
2+
3+
import (
4+
"errors"
5+
"sync"
6+
)
7+
8+
type MemoryRepo struct {
9+
db map[string]MetricValue
10+
*sync.RWMutex
11+
}
12+
13+
func NewMemoryRepo() (*MemoryRepo, error) {
14+
return &MemoryRepo{
15+
db: make(map[string]MetricValue),
16+
RWMutex: &sync.RWMutex{},
17+
}, nil
18+
}
19+
20+
func (m *MemoryRepo) Len() int {
21+
m.RLock()
22+
defer m.RUnlock()
23+
return len(m.db)
24+
}
25+
26+
func (m MemoryRepo) Write(key string, value MetricValue) error {
27+
m.Lock()
28+
defer m.Unlock()
29+
m.db[key] = value
30+
return nil
31+
}
32+
33+
func (m *MemoryRepo) Delete(key string) (MetricValue, bool) {
34+
m.Lock()
35+
defer m.Unlock()
36+
oldValue, ok := m.db[key]
37+
if ok {
38+
delete(m.db, key)
39+
}
40+
return oldValue, ok
41+
}
42+
43+
func (m MemoryRepo) Read(key string) (MetricValue, error) {
44+
m.RLock()
45+
defer m.RUnlock()
46+
value, err := m.db[key]
47+
if !err {
48+
return MetricValue{}, errors.New("Значение по ключу не найдено, ключ: " + key)
49+
}
50+
51+
return value, nil
52+
}
53+
54+
func (m MemoryRepo) GetSchemaDump() map[string]MetricValue {
55+
m.RLock()
56+
defer m.RUnlock()
57+
return m.db
58+
}
59+
60+
func (m *MemoryRepo) Close() error {
61+
return nil
62+
}

0 commit comments

Comments
 (0)